Yasr – Yet Another Stars Rating - Version 1.8.7

Version Description

  • FIXED: Security fix
  • FIXED: if yasr_visitor_votes is used twice in the same page, loader and results are now shown in the right place
  • TWEAKED: updated freemius sdk to version 2.2.3
  • NEW FEATURE: Yasr now works with WP Fastest Cache WordPress Cache plugin by Emre Vona
  • NEW FEATURE: Yasr now works with Cache Enabler WordPress Cache plugin by KeyCDN
Download this release

Release Info

Developer Dudo
Plugin Icon 128x128 Yasr – Yet Another Stars Rating
Version 1.8.7
Comparing to
See all releases

Code changes from version 1.8.6 to 1.8.7

Files changed (38) hide show
  1. freemius/assets/css/admin/common.css +2 -2
  2. freemius/assets/scss/admin/_plugin-upgrade-notice.scss +8 -0
  3. freemius/assets/scss/admin/common.scss +4 -2
  4. freemius/includes/class-freemius.php +365 -70
  5. freemius/includes/class-fs-api.php +14 -4
  6. freemius/includes/class-fs-plugin-updater.php +8 -4
  7. freemius/includes/class-fs-storage.php +1 -2
  8. freemius/includes/fs-core-functions.php +115 -91
  9. freemius/includes/managers/class-fs-admin-menu-manager.php +5 -5
  10. freemius/includes/managers/class-fs-admin-notice-manager.php +32 -1
  11. freemius/languages/freemius-da_DK.po +203 -203
  12. freemius/languages/freemius-en.po +184 -184
  13. freemius/languages/freemius-es_ES.po +203 -203
  14. freemius/languages/freemius-fr_FR.mo +0 -0
  15. freemius/languages/freemius-fr_FR.po +236 -236
  16. freemius/languages/freemius-he_IL.po +203 -203
  17. freemius/languages/freemius-hu_HU.mo +0 -0
  18. freemius/languages/freemius-hu_HU.po +2433 -0
  19. freemius/languages/freemius-it_IT.mo +0 -0
  20. freemius/languages/freemius-it_IT.po +217 -214
  21. freemius/languages/freemius-ja_JP.po +203 -203
  22. freemius/languages/freemius-nl_NL.po +203 -203
  23. freemius/languages/freemius-ru_RU.po +203 -203
  24. freemius/languages/freemius.pot +184 -184
  25. freemius/start.php +15 -8
  26. freemius/templates/account/partials/addon.php +1 -1
  27. freemius/templates/add-ons.php +1 -1
  28. freemius/templates/admin-notice.php +29 -1
  29. freemius/templates/checkout.php +2 -2
  30. freemius/templates/contact.php +3 -3
  31. freemius/templates/pricing.php +2 -2
  32. freemius/templates/tabs.php +4 -0
  33. js/yasr-front.js +17 -13
  34. lib/yasr-ajax-functions.php +8 -1
  35. lib/yasr-functions.php +50 -15
  36. lib/yasr-shortcode-functions.php +46 -35
  37. readme.txt +16 -1
  38. yet-another-stars-rating.php +2 -2
freemius/assets/css/admin/common.css CHANGED
@@ -1,2 +1,2 @@
1
- .theme-browser .theme .fs-premium-theme-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);font-size:1.1em}#iframe{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media (max-width: 600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}}
2
- .fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,0.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,0.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,0.3);box-shadow:0 2px 2px rgba(6,113,6,0.3);opacity:0.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 500px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:greenyellow}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("/wp-admin/images/wpspin_light-2x.gif");background-size:contain}.wrap.fs-section h2{text-align:left}
1
+ .theme-browser .theme .fs-premium-theme-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);font-size:1.1em}#fs_frame{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media (max-width: 600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}}
2
+ .fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,0.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;-moz-box-shadow:0 2px 2px rgba(6,113,6,0.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,0.3);box-shadow:0 2px 2px rgba(6,113,6,0.3);opacity:0.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 500px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:greenyellow}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("/wp-admin/images/wpspin_light-2x.gif");background-size:contain}.wrap.fs-section h2{text-align:left}.plugins p.fs-upgrade-notice{border:0;background-color:#d54e21;padding:10px;color:#f9f9f9;margin-top:10px}
freemius/assets/scss/admin/_plugin-upgrade-notice.scss ADDED
@@ -0,0 +1,8 @@
1
+ .plugins p.fs-upgrade-notice
2
+ {
3
+ border: 0;
4
+ background-color: #d54e21;
5
+ padding: 10px;
6
+ color: #f9f9f9;
7
+ margin-top: 10px;
8
+ }
freemius/assets/scss/admin/common.scss CHANGED
@@ -1,7 +1,7 @@
1
@import "../start";
2
@import "themes";
3
4
- #iframe
5
{
6
line-height: 0;
7
font-size: 0;
@@ -215,4 +215,6 @@ span.fs-submenu-item.fs-sub:before
215
h2 {
216
text-align: left;
217
}
218
- }
1
@import "../start";
2
@import "themes";
3
4
+ #fs_frame
5
{
6
line-height: 0;
7
font-size: 0;
215
h2 {
216
text-align: left;
217
}
218
+ }
219
+
220
+ @import "plugin-upgrade-notice";
freemius/includes/class-freemius.php CHANGED
@@ -1265,6 +1265,26 @@
1265
add_action( 'plugins_loaded', array( &$this, '_hook_action_links_and_register_account_hooks' ) );
1266
1267
if ( $this->is_plugin() ) {
1268
$plugin_dir = dirname( $this->_plugin_dir_path ) . '/';
1269
1270
/**
@@ -1432,6 +1452,84 @@
1432
}
1433
}
1434
1435
/**
1436
* Keeping the uninstall hook registered for free or premium plugin version may result to a fatal error that
1437
* could happen when a user tries to uninstall either version while one of them is still active. Uninstalling a
@@ -1539,22 +1637,10 @@
1539
( $this->is_theme() && self::is_themes_page() )
1540
) {
1541
add_action( 'admin_footer', array( &$this, '_add_deactivation_feedback_dialog_box' ) );
1542
-
1543
- if ( $this->is_plugin() ) {
1544
- add_action( 'admin_enqueue_scripts', array( &$this, '_enqueue_plugin_upgrade_notice_style' ) );
1545
- }
1546
}
1547
}
1548
}
1549
1550
- /**
1551
- * @author Leo Fajardo (@leorw)
1552
- * @since 2.1.4
1553
- */
1554
- function _enqueue_plugin_upgrade_notice_style() {
1555
- fs_enqueue_local_style( 'fs_plugin_upgrade_notice', '/admin/plugin-upgrade-notice.css' );
1556
- }
1557
-
1558
/**
1559
* Leverage backtrace to find caller plugin file path.
1560
*
@@ -1670,7 +1756,7 @@
1670
1671
return fs_normalize_path( trailingslashit( $is_plugin ?
1672
WP_PLUGIN_DIR :
1673
- get_theme_root() ) );
1674
}
1675
1676
/**
@@ -1757,7 +1843,7 @@
1757
$caller_file_candidate = false;
1758
$caller_map = array();
1759
$module_type = WP_FS__MODULE_TYPE_PLUGIN;
1760
- $themes_dir = fs_normalize_path( get_theme_root() );
1761
1762
for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) {
1763
if ( empty( $bt[ $i ]['file'] ) ) {
@@ -2586,6 +2672,11 @@
2586
get_option( 'active_plugins' );
2587
2588
$active = array();
2589
foreach ( $active_basenames as $basename ) {
2590
$active[ $basename ] = array(
2591
'is_active' => true,
@@ -4180,6 +4271,7 @@
4180
*/
4181
if ( $this->is_user_in_admin() &&
4182
'plugin-information' === fs_request_get( 'tab', false ) &&
4183
(
4184
( $this->is_addon() && $this->get_slug() == fs_request_get( 'plugin', false ) ) ||
4185
( $this->has_addons() && $this->get_id() == fs_request_get( 'parent_plugin_id', false ) )
@@ -4301,7 +4393,21 @@
4301
* @author Vova Feldman
4302
* @since 1.2.1.6
4303
*/
4304
- if ( $this->is_premium() && $this->has_release_on_freemius() ) {
4305
FS_Plugin_Updater::instance( $this );
4306
}
4307
@@ -4344,6 +4450,26 @@
4344
}
4345
}
4346
4347
/**
4348
* @author Leo Fajardo (@leorw)
4349
*
@@ -5615,6 +5741,20 @@
5615
$this->_storage->store( "{$name}_timestamp", time() );
5616
}
5617
5618
/**
5619
* Check if cron was executed in the last $period of seconds.
5620
*
@@ -5629,7 +5769,7 @@
5629
private function is_cron_executed( $name, $period = WP_FS__TIME_24_HOURS_IN_SEC ) {
5630
$this->_logger->entrance( $name );
5631
5632
- $last_execution = $this->set_cron_execution_timestamp( $name );
5633
5634
if ( ! is_numeric( $last_execution ) ) {
5635
return false;
@@ -5897,7 +6037,7 @@
5897
$this->switch_to_blog( $blog_ids[0] );
5898
}
5899
5900
- call_user_func_array( $callable, array( $blog_ids ) );
5901
5902
foreach ( $blog_ids as $blog_id ) {
5903
$this->do_action( "after_{$name}_cron", $blog_id );
@@ -5978,13 +6118,16 @@
5978
* @author Vova Feldman (@svovaf)
5979
* @since 2.0.0
5980
*
5981
- * @param int[] $blog_ids
5982
*/
5983
- function _sync_cron_method( array $blog_ids ) {
5984
if ( $this->is_registered() ) {
5985
if ( $this->has_paid_plan() ) {
5986
// Initiate background plan sync.
5987
- $this->_sync_license( true );
5988
5989
if ( $this->is_paying() ) {
5990
// Check for premium plugin updates.
@@ -6199,9 +6342,10 @@
6199
* @author Vova Feldman (@svovaf)
6200
* @since 2.0.0
6201
*
6202
- * @param int[] $blog_ids
6203
*/
6204
- function _sync_install_cron_method( array $blog_ids ) {
6205
if ( $this->is_registered() ) {
6206
if ( 1 < count( $blog_ids ) ) {
6207
$this->sync_installs( array(), true );
@@ -6898,7 +7042,7 @@
6898
if (
6899
$is_premium_version_activation &&
6900
(
6901
- $this->is_anonymous() ||
6902
(
6903
$this->is_registered() &&
6904
! $this->is_trial() &&
@@ -7831,38 +7975,43 @@
7831
$include_plugins = true,
7832
$include_themes = true
7833
) {
7834
- /**
7835
- * @since 1.1.8 Also send plugin updates.
7836
- */
7837
- if ( $include_plugins && ! isset( $override['plugins'] ) ) {
7838
- $plugins = $this->get_plugins_data_for_api();
7839
- if ( ! empty( $plugins ) ) {
7840
- $override['plugins'] = $plugins;
7841
}
7842
}
7843
- /**
7844
- * @since 1.1.8 Also send themes updates.
7845
- */
7846
- if ( $include_themes && ! isset( $override['themes'] ) ) {
7847
- $themes = $this->get_themes_data_for_api();
7848
- if ( ! empty( $themes ) ) {
7849
- $override['themes'] = $themes;
7850
}
7851
}
7852
7853
$versions = $this->get_versions();
7854
7855
return array_merge( $versions, array(
7856
- 'version' => $this->get_plugin_version(),
7857
- 'is_premium' => $this->is_premium(),
7858
- 'language' => get_bloginfo( 'language' ),
7859
- 'charset' => get_bloginfo( 'charset' ),
7860
- 'title' => get_bloginfo( 'name' ),
7861
- 'url' => get_site_url(),
7862
// Special params.
7863
- 'is_active' => true,
7864
- 'is_disconnected' => $this->is_tracking_prohibited(),
7865
- 'is_uninstalled' => false,
7866
), $override );
7867
}
7868
@@ -8064,28 +8213,56 @@
8064
$params = $this->get_install_diff_for_api( $check_properties, $this->_site, $override );
8065
}
8066
8067
- if ( 0 < count( $params ) ) {
8068
if ( ! is_multisite() ) {
8069
// Update last install sync timestamp.
8070
$this->set_cron_execution_timestamp( 'install_sync' );
8071
}
8072
8073
$params['uid'] = $this->get_anonymous_id();
8074
8075
- // Send updated values to FS.
8076
- $site = $this->get_api_site_scope()->call( '/', 'put', $params );
8077
8078
- if ( $this->is_api_result_entity( $site ) ) {
8079
- if ( ! is_multisite() ) {
8080
- // I successfully sent install update, clear scheduled sync if exist.
8081
- $this->clear_install_sync_cron();
8082
- }
8083
- }
8084
8085
- return $site;
8086
}
8087
8088
- return false;
8089
}
8090
8091
/**
@@ -8104,24 +8281,70 @@
8104
8105
$installs_data = $this->get_installs_data_for_api( $override, ! $flush );
8106
8107
if ( empty( $installs_data ) ) {
8108
- return false;
8109
}
8110
8111
- // Update last install sync timestamp.
8112
- $this->set_cron_execution_timestamp( 'install_sync' );
8113
8114
// Send updated values to FS.
8115
$result = $this->get_api_user_scope()->call( "/plugins/{$this->_plugin->id}/installs.json", 'put', $installs_data );
8116
8117
- if ( $this->is_api_result_object( $result, 'installs' ) ) {
8118
- // I successfully sent installs update, clear scheduled sync if exist.
8119
$this->clear_install_sync_cron();
8120
}
8121
8122
return $result;
8123
}
8124
8125
/**
8126
* Update install only if changed.
8127
*
@@ -9372,7 +9595,16 @@
9372
* @return bool
9373
*/
9374
function is_premium() {
9375
- return $this->_plugin->is_premium;
9376
}
9377
9378
/**
@@ -11347,6 +11579,34 @@
11347
static function get_current_page() {
11348
if ( ! isset( self::$_pagenow ) ) {
11349
global $pagenow;
11350
11351
self::$_pagenow = $pagenow;
11352
@@ -11378,6 +11638,16 @@
11378
return ( 'plugins.php' === self::get_current_page() );
11379
}
11380
11381
/**
11382
* @author Leo Fajardo (@leorw)
11383
* @since 2.0.2
@@ -12515,7 +12785,7 @@
12515
12516
self::$_accounts->set_site_blog_context( $blog_id );
12517
$this->_storage->set_site_blog_context( $blog_id );
12518
- $this->_storage->set_network_active( true, $this->is_delegated_connection( $blog_id ) );
12519
12520
$this->_site = is_object( $install ) ?
12521
$install :
@@ -16829,8 +17099,11 @@
16829
* the admin.
16830
* @param bool $is_context_single_site @since 2.0.0. This is used when syncing a license for a single install from the
16831
* network-level "Account" page.
16832
*/
16833
- private function _sync_license( $background = false, $is_context_single_site = false ) {
16834
$this->_logger->entrance();
16835
16836
$plugin_id = fs_request_get( 'plugin_id', $this->get_id() );
@@ -16840,7 +17113,7 @@
16840
if ( $is_addon_sync ) {
16841
$this->_sync_addon_license( $plugin_id, $background );
16842
} else {
16843
- $this->_sync_plugin_license( $background, true, $is_context_single_site );
16844
}
16845
16846
$this->do_action( 'after_account_plan_sync', $this->get_plan_name() );
@@ -16930,11 +17203,15 @@
16930
* @param bool $is_context_single_site Since 2.0.0. This is used when sending an update for a single install and
16931
* syncing its license from the network-level "Account" page (e.g.: after
16932
* activating a license only for the single install).
16933
*/
16934
private function _sync_plugin_license(
16935
$background = false,
16936
$send_installs_update = true,
16937
- $is_context_single_site = false
16938
) {
16939
$this->_logger->entrance();
16940
@@ -16951,6 +17228,16 @@
16951
* @todo This line will execute install sync on a daily basis, even if running the free version (for opted-in users). The reason we want to keep it that way is for cases when the user was a paying customer, then there was a failure in subscription payment, and then after some time the payment was successful. This could be heavily optimized. For example, we can skip the $flush if the current install was never associated with a paid version.
16952
*/
16953
if ( $is_site_level_sync ) {
16954
$result = $this->send_install_update( array(), true );
16955
$is_valid = $this->is_api_result_entity( $result );
16956
} else {
@@ -18412,7 +18699,9 @@
18412
*/
18413
function get_after_activation_url( $filter, $params = array(), $network = null ) {
18414
if ( $this->is_free_wp_org_theme() &&
18415
- fs_request_has( 'pending_activation' )
18416
) {
18417
$first_time_path = '';
18418
} else {
@@ -20721,13 +21010,19 @@
20721
20722
// Locate the main assets folder.
20723
if ( 1 < count( $fs_active_plugins->plugins ) ) {
20724
- $plugin_or_theme_img_dir = ( $this->is_plugin() ? WP_PLUGIN_DIR : get_theme_root() );
20725
20726
foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) {
20727
if ( $data->plugin_path == $this->get_plugin_basename() ) {
20728
$img_dir = $plugin_or_theme_img_dir
20729
. '/'
20730
- . str_replace( '../themes/', '', $sdk_path )
20731
. '/assets/img';
20732
20733
break;
1265
add_action( 'plugins_loaded', array( &$this, '_hook_action_links_and_register_account_hooks' ) );
1266
1267
if ( $this->is_plugin() ) {
1268
+ if ( self::is_plugin_install_page() && true !== fs_request_get_bool( 'fs_allow_updater_and_dialog' ) ) {
1269
+ /**
1270
+ * Unless the `fs_allow_updater_and_dialog` URL param exists and its value is `true`, make
1271
+ * Freemius-related updates unavailable on the "Add Plugins" admin page (/plugin-install.php)
1272
+ * so that they won't interfere with the .org plugins' functionalities on that page (e.g.
1273
+ * updating of a .org plugin).
1274
+ */
1275
+ add_filter( 'site_transient_update_plugins', array( 'Freemius', '_remove_fs_updates_from_plugin_install_page' ), 10, 2 );
1276
+ } else if ( self::is_plugins_page() || self::is_updates_page() ) {
1277
+ /**
1278
+ * On the "Plugins" and "Updates" admin pages, if there are premium or non–org-compliant
1279
+ * plugins, modify their details dialog URLs (add a Freemius-specific param) so that the SDK can
1280
+ * determine if the plugin information dialog should show information from Freemius.
1281
+ *
1282
+ * @author Leo Fajardo (@leorw)
1283
+ * @since 2.2.3
1284
+ */
1285
+ add_action( 'admin_footer', array( 'Freemius', '_prepend_fs_allow_updater_and_dialog_flag_url_param' ) );
1286
+ }
1287
+
1288
$plugin_dir = dirname( $this->_plugin_dir_path ) . '/';
1289
1290
/**
1452
}
1453
}
1454
1455
+ /**
1456
+ * Makes Freemius-related updates unavailable on the "Add Plugins" admin page (/plugin-install.php) so that
1457
+ * they won't interfere with the .org plugins' functionalities on that page (e.g. updating of a .org plugin).
1458
+ *
1459
+ * @author Leo Fajardo (@leorw)
1460
+ * @since 2.2.3
1461
+ *
1462
+ * @param object $updates
1463
+ * @param string|null $transient
1464
+ *
1465
+ * @return object
1466
+ */
1467
+ static function _remove_fs_updates_from_plugin_install_page( $updates, $transient = null ) {
1468
+ if ( is_object( $updates ) && isset( $updates->response ) ) {
1469
+ foreach ( $updates->response as $file => $plugin ) {
1470
+ if ( false !== strpos( $plugin->package, 'api.freemius' ) ) {
1471
+ unset( $updates->response[ $file ] );
1472
+ }
1473
+ }
1474
+ }
1475
+
1476
+ return $updates;
1477
+ }
1478
+
1479
+ /**
1480
+ * Prepends the `fs_allow_updater_and_dialog` param to the plugin information URLs to tell the SDK to handle
1481
+ * the information that is shown on the plugin details dialog that is shown when the relevant link is clicked.
1482
+ *
1483
+ * @author Leo Fajardo (@leorw)
1484
+ * @since 2.2.3
1485
+ *
1486
+ * @return string
1487
+ */
1488
+ static function _prepend_fs_allow_updater_and_dialog_flag_url_param() {
1489
+ $slug_basename_map = array();
1490
+ foreach ( self::$_instances as $instance ) {
1491
+ if ( ! $instance->is_plugin() ) {
1492
+ continue;
1493
+ }
1494
+
1495
+ $slug_basename_map[ $instance->get_slug() ] = $instance->premium_plugin_basename();
1496
+ }
1497
+ ?>
1498
+ <script type="text/javascript">
1499
+ (function( $ ) {
1500
+ var slugBasenameMap = <?php echo json_encode( $slug_basename_map ) ?>;
1501
+ for ( var slug in slugBasenameMap ) {
1502
+ var basename = slugBasenameMap[ slug ];
1503
+
1504
+ // Try to get the plugin rows if on the "Plugins" page.
1505
+ var $pluginRows = $( '.wp-list-table.plugins tr[data-plugin="' + basename + '"]');
1506
+
1507
+ if ( 0 === $pluginRows.length ) {
1508
+ // Try to get the plugin rows if on the "Updates" page.
1509
+ var $pluginCheckbox = $( '#update-plugins-table input[type="checkbox"][value="' + basename + '"]' );
1510
+ if ( 0 !== $pluginCheckbox.length ) {
1511
+ $pluginRows = $pluginCheckbox.parents( 'tr:first' );
1512
+ }
1513
+ }
1514
+
1515
+ if ( 0 === $pluginRows.length ) {
1516
+ // No plugin rows found.
1517
+ continue;
1518
+ }
1519
+
1520
+ // Find the "View details" links and add the `fs_allow_updater_and_dialog` param to the URL.
1521
+ $pluginRows.find( 'a[href*="plugin-install.php?tab=plugin-information"]' ).each(function() {
1522
+ var $this = $( this ),
1523
+ href = $this.attr( 'href' ).replace( '?tab=', '?fs_allow_updater_and_dialog=true&tab=');
1524
+
1525
+ $this.attr( 'href', href );
1526
+ });
1527
+ }
1528
+ })( jQuery );
1529
+ </script>
1530
+ <?php
1531
+ }
1532
+
1533
/**
1534
* Keeping the uninstall hook registered for free or premium plugin version may result to a fatal error that
1535
* could happen when a user tries to uninstall either version while one of them is still active. Uninstalling a
1637
( $this->is_theme() && self::is_themes_page() )
1638
) {
1639
add_action( 'admin_footer', array( &$this, '_add_deactivation_feedback_dialog_box' ) );
1640
}
1641
}
1642
}
1643
1644
/**
1645
* Leverage backtrace to find caller plugin file path.
1646
*
1756
1757
return fs_normalize_path( trailingslashit( $is_plugin ?
1758
WP_PLUGIN_DIR :
1759
+ get_theme_root( get_stylesheet() ) ) );
1760
}
1761
1762
/**
1843
$caller_file_candidate = false;
1844
$caller_map = array();
1845
$module_type = WP_FS__MODULE_TYPE_PLUGIN;
1846
+ $themes_dir = fs_normalize_path( get_theme_root( get_stylesheet() ) );
1847
1848
for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) {
1849
if ( empty( $bt[ $i ]['file'] ) ) {
2672
get_option( 'active_plugins' );
2673
2674
$active = array();
2675
+
2676
+ if ( ! is_array( $active_basenames ) ) {
2677
+ return $active;
2678
+ }
2679
+
2680
foreach ( $active_basenames as $basename ) {
2681
$active[ $basename ] = array(
2682
'is_active' => true,
4271
*/
4272
if ( $this->is_user_in_admin() &&
4273
'plugin-information' === fs_request_get( 'tab', false ) &&
4274
+ $this->should_use_freemius_updater_and_dialog() &&
4275
(
4276
( $this->is_addon() && $this->get_slug() == fs_request_get( 'plugin', false ) ) ||
4277
( $this->has_addons() && $this->get_id() == fs_request_get( 'parent_plugin_id', false ) )
4393
* @author Vova Feldman
4394
* @since 1.2.1.6
4395
*/
4396
+ if (
4397
+ $this->should_use_freemius_updater_and_dialog() &&
4398
+ (
4399
+ $this->is_premium() ||
4400
+ /**
4401
+ * If not premium but the premium version is installed, also instantiate the updater so that the
4402
+ * plugin information dialog of the premium version will have the information from the server.
4403
+ *
4404
+ * @author Leo Fajardo (@leorw)
4405
+ * @since 2.2.3
4406
+ */
4407
+ ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this->premium_plugin_basename() ) ) )
4408
+ ) &&
4409
+ $this->has_release_on_freemius()
4410
+ ) {
4411
FS_Plugin_Updater::instance( $this );
4412
}
4413
4450
}
4451
}
4452
4453
+ /**
4454
+ * @author Leo Fajardo (@leorw)
4455
+ * @since 2.2.3
4456
+ *
4457
+ * @return bool
4458
+ */
4459
+ private function should_use_freemius_updater_and_dialog() {
4460
+ return (
4461
+ /**
4462
+ * Unless the `fs_allow_updater_and_dialog` URL param exists and its value is `true`, disallow updater
4463
+ * and dialog on the "Add Plugins" admin page (/plugin-install.php) so that they won't interfere with
4464
+ * the .org plugins' functionalities on that page (e.g. installation and viewing plugin details from
4465
+ * .org).
4466
+ */
4467
+ ( ! self::is_plugin_install_page() || true === fs_request_get_bool( 'fs_allow_updater_and_dialog' ) ) &&
4468
+ // Disallow updater and dialog when installing a plugin, otherwise .org "add-on" plugins will be affected.
4469
+ ( 'install-plugin' !== fs_request_get( 'action' ) )
4470
+ );
4471
+ }
4472
+
4473
/**
4474
* @author Leo Fajardo (@leorw)
4475
*
5741
$this->_storage->store( "{$name}_timestamp", time() );
5742
}
5743
5744
+ /**
5745
+ * Sets the keepalive time to now.
5746
+ *
5747
+ * @author Leo Fajardo (@leorw)
5748
+ * @since 2.2.3
5749
+ *
5750
+ * @param bool|null $use_network_level_storage
5751
+ */
5752
+ private function set_keepalive_timestamp( $use_network_level_storage = null ) {
5753
+ $this->_logger->entrance();
5754
+
5755
+ $this->_storage->store( 'keepalive_timestamp', time(), $use_network_level_storage );
5756
+ }
5757
+
5758
/**
5759
* Check if cron was executed in the last $period of seconds.
5760
*
5769
private function is_cron_executed( $name, $period = WP_FS__TIME_24_HOURS_IN_SEC ) {
5770
$this->_logger->entrance( $name );
5771
5772
+ $last_execution = $this->cron_last_execution( $name );
5773
5774
if ( ! is_numeric( $last_execution ) ) {
5775
return false;
6037
$this->switch_to_blog( $blog_ids[0] );
6038
}
6039
6040
+ call_user_func_array( $callable, array( $blog_ids, ( is_multisite() ? $current_blog_id : null ) ) );
6041
6042
foreach ( $blog_ids as $blog_id ) {
6043
$this->do_action( "after_{$name}_cron", $blog_id );
6118
* @author Vova Feldman (@svovaf)
6119
* @since 2.0.0
6120
*
6121
+ * @param int[] $blog_ids
6122
+ * @param int|null $current_blog_id @since 2.2.3. This is passed from the `execute_cron` method and used by the
6123
+ * `_sync_plugin_license` method in order to switch to the previous blog when sending
6124
+ * updates for a single site in case `execute_cron` has switched to a different blog.
6125
*/
6126
+ function _sync_cron_method( array $blog_ids, $current_blog_id = null ) {
6127
if ( $this->is_registered() ) {
6128
if ( $this->has_paid_plan() ) {
6129
// Initiate background plan sync.
6130
+ $this->_sync_license( true, false, $current_blog_id );
6131
6132
if ( $this->is_paying() ) {
6133
// Check for premium plugin updates.
6342
* @author Vova Feldman (@svovaf)
6343
* @since 2.0.0
6344
*
6345
+ * @param int[] $blog_ids
6346
+ * @param int|null $current_blog_id
6347
*/
6348
+ function _sync_install_cron_method( array $blog_ids, $current_blog_id = null ) {
6349
if ( $this->is_registered() ) {
6350
if ( 1 < count( $blog_ids ) ) {
6351
$this->sync_installs( array(), true );
7042
if (
7043
$is_premium_version_activation &&
7044
(
7045
+ ( ! $this->is_registered() && $this->is_anonymous() ) ||
7046
(
7047
$this->is_registered() &&
7048
! $this->is_trial() &&
7975
$include_plugins = true,
7976
$include_themes = true
7977
) {
7978
+ if ( ! defined( 'WP_FS__TRACK_PLUGINS' ) || false !== WP_FS__TRACK_PLUGINS ) {
7979
+ /**
7980
+ * @since 1.1.8 Also send plugin updates.
7981
+ */
7982
+ if ( $include_plugins && ! isset( $override['plugins'] ) ) {
7983
+ $plugins = $this->get_plugins_data_for_api();
7984
+ if ( ! empty( $plugins ) ) {
7985
+ $override['plugins'] = $plugins;
7986
+ }
7987
}
7988
}
7989
+
7990
+ if ( ! defined( 'WP_FS__TRACK_THEMES' ) || false !== WP_FS__TRACK_THEMES ) {
7991
+ /**
7992
+ * @since 1.1.8 Also send themes updates.
7993
+ */
7994
+ if ( $include_themes && ! isset( $override['themes'] ) ) {
7995
+ $themes = $this->get_themes_data_for_api();
7996
+ if ( ! empty( $themes ) ) {
7997
+ $override['themes'] = $themes;
7998
+ }
7999
}
8000
}
8001
8002
$versions = $this->get_versions();
8003
8004
return array_merge( $versions, array(
8005
+ 'version' => $this->get_plugin_version(),
8006
+ 'is_premium' => $this->is_premium(),
8007
+ 'language' => get_bloginfo( 'language' ),
8008
+ 'charset' => get_bloginfo( 'charset' ),
8009
+ 'title' => get_bloginfo( 'name' ),
8010
+ 'url' => get_site_url(),
8011
// Special params.
8012
+ 'is_active' => true,
8013
+ 'is_disconnected' => $this->is_tracking_prohibited(),
8014
+ 'is_uninstalled' => false,
8015
), $override );
8016
}
8017
8213
$params = $this->get_install_diff_for_api( $check_properties, $this->_site, $override );
8214
}
8215
8216
+ $keepalive_only_update = false;
8217
+ if ( empty( $params ) ) {
8218
+ $keepalive_only_update = $this->should_send_keepalive_update();
8219
+
8220
+ if ( ! $keepalive_only_update ) {
8221
+ /**
8222
+ * There are no updates to send including keepalive.
8223
+ *
8224
+ * @author Leo Fajardo (@leorw)
8225
+ * @since 2.2.3
8226
+ */
8227
+ return false;
8228
+ }
8229
+ }
8230
+
8231
+ if ( ! $keepalive_only_update ) {
8232
+ /**
8233
+ * Do not update the last install sync timestamp after a keepalive-only call since there were no actual
8234
+ * updates sent.
8235
+ *
8236
+ * @author Leo Fajardo (@leorw)
8237
+ * @since 2.2.3
8238
+ */
8239
if ( ! is_multisite() ) {
8240
// Update last install sync timestamp.
8241
$this->set_cron_execution_timestamp( 'install_sync' );
8242
}
8243
8244
$params['uid'] = $this->get_anonymous_id();
8245
+ }
8246
8247
+ $this->set_keepalive_timestamp();
8248
8249
+ // Send updated values to FS.
8250
+ $site = $this->get_api_site_scope()->call( '/', 'put', $params );
8251
8252
+ if ( ! $keepalive_only_update && $this->is_api_result_entity( $site ) ) {
8253
+ /**
8254
+ * Do not clear scheduled sync after a keepalive-only call since there were no actual updates sent.
8255
+ *
8256
+ * @author Leo Fajardo (@leorw)
8257
+ * @since 2.2.3
8258
+ */
8259
+ if ( ! is_multisite() ) {
8260
+ // I successfully sent install update, clear scheduled sync if exist.
8261
+ $this->clear_install_sync_cron();
8262
+ }
8263
}
8264
8265
+ return $site;
8266
}
8267
8268
/**
8281
8282
$installs_data = $this->get_installs_data_for_api( $override, ! $flush );
8283
8284
+ $keepalive_only_update = false;
8285
if ( empty( $installs_data ) ) {
8286
+ /**
8287
+ * Pass `true` to use the network level storage since the update is for many installs.
8288
+ *
8289
+ * @author Leo Fajardo (@leorw)
8290
+ * @since 2.2.3
8291
+ */
8292
+ $keepalive_only_update = $this->should_send_keepalive_update( true );
8293
+
8294
+ if ( ! $keepalive_only_update ) {
8295
+ /**
8296
+ * There are no updates to send including keepalive.
8297
+ *
8298
+ * @author Leo Fajardo (@leorw)
8299
+ * @since 2.2.3
8300
+ */
8301
+ return false;
8302
+ }
8303
}
8304
8305
+ if ( ! $keepalive_only_update ) {
8306
+ // Update last install sync timestamp if there were actual updates sent (i.e., not a keepalive-only call).
8307
+ $this->set_cron_execution_timestamp( 'install_sync' );
8308
+ }
8309
+
8310
+ /**
8311
+ * Pass `true` to use the network level storage since the update is for many installs.
8312
+ *
8313
+ * @author Leo Fajardo (@leorw)
8314
+ * @since 2.2.3
8315
+ */
8316
+ $this->set_keepalive_timestamp( true );
8317
8318
// Send updated values to FS.
8319
$result = $this->get_api_user_scope()->call( "/plugins/{$this->_plugin->id}/installs.json", 'put', $installs_data );
8320
8321
+ if ( ! $keepalive_only_update && $this->is_api_result_object( $result, 'installs' ) ) {
8322
+ // I successfully sent installs update (there was an actual update sent and it's not just a keepalive-only call), clear scheduled sync if exist.
8323
$this->clear_install_sync_cron();
8324
}
8325
8326
return $result;
8327
}
8328
8329
+ /**
8330
+ * @author Leo Fajardo (@leorw)
8331
+ *
8332
+ * @param bool|null $use_network_level_storage
8333
+ *
8334
+ * @return bool
8335
+ */
8336
+ private function should_send_keepalive_update( $use_network_level_storage = null ) {
8337
+ $keepalive_timestamp = $this->_storage->get( 'keepalive_timestamp', 0, $use_network_level_storage );
8338
+
8339
+ if ( $keepalive_timestamp < ( time() - WP_FS__TIME_WEEK_IN_SEC ) ) {
8340
+ // If updated more than 7 days ago, trigger a keepalive and update the time it was triggered.
8341
+ return true;
8342
+ } else {
8343
+ // If updated 7 days ago or less, "flip a coin", if the value is 7 trigger a keepalive and update the last time it was triggered.
8344
+ return ( 7 == rand( 1, 7 ) );
8345
+ }
8346
+ }
8347
+
8348
/**
8349
* Update install only if changed.
8350
*
9595
* @return bool
9596
*/
9597
function is_premium() {
9598
+ /**
9599
+ * `$this->_plugin` will be `false` when `is_activation_mode` calls this method directly from the
9600
+ * `_register_hooks` method.
9601
+ *
9602
+ * @author Leo Fajardo (@leorw)
9603
+ * @since 2.2.3
9604
+ */
9605
+ return is_object( $this->_plugin ) ?
9606
+ $this->_plugin->is_premium :
9607
+ false;
9608
}
9609
9610
/**
11579
static function get_current_page() {
11580
if ( ! isset( self::$_pagenow ) ) {
11581
global $pagenow;
11582
+ if ( empty( $pagenow ) && is_admin() && is_multisite() ) {
11583
+ /**
11584
+ * It appears that `$pagenow` is not yet initialized in some network admin pages when this method
11585
+ * is called, so initialize it here using some pieces of code from `wp-includes/vars.php`.
11586
+ *
11587
+ * @author Leo Fajardo (@leorw)
11588
+ * @since 2.2.3
11589
+ */
11590
+ if ( is_network_admin() ) {
11591
+ preg_match( '#/wp-admin/network/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches );
11592
+ } else if ( is_user_admin() ) {
11593
+ preg_match( '#/wp-admin/user/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches );
11594
+ } else {
11595
+ preg_match( '#/wp-admin/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches );
11596
+ }
11597
+
11598
+ $pagenow = $self_matches[1];
11599
+ $pagenow = trim( $pagenow, '/' );
11600
+ $pagenow = preg_replace( '#\?.*?$#', '', $pagenow );
11601
+ if ( '' === $pagenow || 'index' === $pagenow || 'index.php' === $pagenow ) {
11602
+ $pagenow = 'index.php';
11603
+ } else {
11604
+ preg_match( '#(.*?)(/|$)#', $pagenow, $self_matches );
11605
+ $pagenow = strtolower( $self_matches[1] );
11606
+ if ( '.php' !== substr($pagenow, -4, 4) )
11607
+ $pagenow .= '.php'; // for Options +Multiviews: /wp-admin/themes/index.php (themes.php is queried)
11608
+ }
11609
+ }
11610
11611
self::$_pagenow = $pagenow;
11612
11638
return ( 'plugins.php' === self::get_current_page() );
11639
}
11640
11641
+ /**
11642
+ * @author Leo Fajardo (@leorw)
11643
+ * @since 2.2.3
11644
+ *
11645
+ * @return bool
11646
+ */
11647
+ static function is_plugin_install_page() {
11648
+ return ( 'plugin-install.php' === self::get_current_page() );
11649
+ }
11650
+
11651
/**
11652
* @author Leo Fajardo (@leorw)
11653
* @since 2.0.2
12785
12786
self::$_accounts->set_site_blog_context( $blog_id );
12787
$this->_storage->set_site_blog_context( $blog_id );
12788
+ $this->_storage->set_network_active( $this->_is_network_active, $this->is_delegated_connection( $blog_id ) );
12789
12790
$this->_site = is_object( $install ) ?
12791
$install :
17099
* the admin.
17100
* @param bool $is_context_single_site @since 2.0.0. This is used when syncing a license for a single install from the
17101
* network-level "Account" page.
17102
+ * @param int|null $current_blog_id @since 2.2.3. This is passed from the `execute_cron` method and used by the
17103
+ * `_sync_plugin_license` method in order to switch to the previous blog when sending
17104
+ * updates for a single site in case `execute_cron` has switched to a different blog.
17105
*/
17106
+ private function _sync_license( $background = false, $is_context_single_site = false, $current_blog_id = null ) {
17107
$this->_logger->entrance();
17108
17109
$plugin_id = fs_request_get( 'plugin_id', $this->get_id() );
17113
if ( $is_addon_sync ) {
17114
$this->_sync_addon_license( $plugin_id, $background );
17115
} else {
17116
+ $this->_sync_plugin_license( $background, true, $is_context_single_site, $current_blog_id );
17117
}
17118
17119
$this->do_action( 'after_account_plan_sync', $this->get_plan_name() );
17203
* @param bool $is_context_single_site Since 2.0.0. This is used when sending an update for a single install and
17204
* syncing its license from the network-level "Account" page (e.g.: after
17205
* activating a license only for the single install).
17206
+ * @param int|null $current_blog_id Since 2.2.3. This is passed from the `execute_cron` method so that it
17207
+ * can be used here to switch to the previous blog in case `execute_cron`
17208
+ * has switched to a different blog.
17209
*/
17210
private function _sync_plugin_license(
17211
$background = false,
17212
$send_installs_update = true,
17213
+ $is_context_single_site = false,
17214
+ $current_blog_id = null
17215
) {
17216
$this->_logger->entrance();
17217
17228
* @todo This line will execute install sync on a daily basis, even if running the free version (for opted-in users). The reason we want to keep it that way is for cases when the user was a paying customer, then there was a failure in subscription payment, and then after some time the payment was successful. This could be heavily optimized. For example, we can skip the $flush if the current install was never associated with a paid version.
17229
*/
17230
if ( $is_site_level_sync ) {
17231
+ /**
17232
+ * Switch to the previous blog since `execute_cron` may have switched to a different blog.
17233
+ *
17234
+ * @author Leo Fajardo (@leorw)
17235
+ * @since 2.2.3
17236
+ */
17237
+ if ( is_numeric( $current_blog_id ) ) {
17238
+ $this->switch_to_blog( $current_blog_id );
17239
+ }
17240
+
17241
$result = $this->send_install_update( array(), true );
17242
$is_valid = $this->is_api_result_entity( $result );
17243
} else {
18699
*/
18700
function get_after_activation_url( $filter, $params = array(), $network = null ) {
18701
if ( $this->is_free_wp_org_theme() &&
18702
+ ( fs_request_has( 'pending_activation' ) ||
18703
+ // For cases when the first time path is set, even though it's a WP.org theme.
18704
+ fs_request_get_bool( $this->get_unique_affix() . '_show_optin' ) )
18705
) {
18706
$first_time_path = '';
18707
} else {
21010
21011
// Locate the main assets folder.
21012
if ( 1 < count( $fs_active_plugins->plugins ) ) {
21013
+ $plugin_or_theme_img_dir = ( $this->is_plugin() ? WP_PLUGIN_DIR : get_theme_root( get_stylesheet() ) );
21014
21015
foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) {
21016
if ( $data->plugin_path == $this->get_plugin_basename() ) {
21017
$img_dir = $plugin_or_theme_img_dir
21018
. '/'
21019
+ /**
21020
+ * The basename will be `themes` or the basename of a custom themes directory.
21021
+ *
21022
+ * @author Leo Fajardo (@leorw)
21023
+ * @since 2.2.3
21024
+ */
21025
+ . str_replace( '../' . basename( $plugin_or_theme_img_dir ) . '/', '', $sdk_path )
21026
. '/assets/img';
21027
21028
break;
freemius/includes/class-fs-api.php CHANGED
@@ -238,7 +238,7 @@
238
if ( ! is_object( $result ) || isset( $result->error ) ) {
239
// Api returned an error.
240
if ( is_object( $cached_result ) &&
241
- ! isset( $cached_result )
242
) {
243
// If there was an error during a newer data fetch,
244
// fallback to older data version.
@@ -248,9 +248,19 @@
248
$this->_logger->warn( 'Fallback to cached API result: ' . var_export( $cached_result, true ) );
249
}
250
} else {
251
- // If no older data version, return result without
252
- // caching the error.
253
- return $result;
254
}
255
}
256
238
if ( ! is_object( $result ) || isset( $result->error ) ) {
239
// Api returned an error.
240
if ( is_object( $cached_result ) &&
241
+ ! isset( $cached_result->error )
242
) {
243
// If there was an error during a newer data fetch,
244
// fallback to older data version.
248
$this->_logger->warn( 'Fallback to cached API result: ' . var_export( $cached_result, true ) );
249
}
250
} else {
251
+ if ( is_object( $result ) && 404 == $result->error->http ) {
252
+ /**
253
+ * If the response code is 404, cache the result for half of the `$expiration`.
254
+ *
255
+ * @author Leo Fajardo (@leorw)
256
+ * @since 2.2.3.1
257
+ */
258
+ $expiration /= 2;
259
+ } else {
260
+ // If no older data version and the response code is not 404, return result without
261
+ // caching the error.
262
+ return $result;
263
+ }
264
}
265
}
266
freemius/includes/class-fs-plugin-updater.php CHANGED
@@ -296,9 +296,13 @@
296
isset( $r->upgrade_notice ) &&
297
strlen( trim( $r->upgrade_notice ) ) > 0
298
) {
299
$upgrade_notice_html = sprintf(
300
- '<p class="notice upgrade-notice"><strong>%s</strong> %s</p>',
301
- fs_text_inline( 'Important Upgrade Notice:', 'upgrade_notice', $this->_fs->get_slug() ),
302
esc_html( $r->upgrade_notice )
303
);
304
@@ -1242,7 +1246,7 @@ if ( !isset($info->error) ) {
1242
static function _store_basename_for_source_adjustment( $response, $hook_extra ) {
1243
if ( isset( $hook_extra['plugin'] ) ) {
1244
self::$_upgrade_basename = $hook_extra['plugin'];
1245
- } else if ( $hook_extra['theme'] ) {
1246
self::$_upgrade_basename = $hook_extra['theme'];
1247
} else {
1248
self::$_upgrade_basename = null;
@@ -1353,4 +1357,4 @@ if ( !isset($info->error) ) {
1353
}
1354
1355
#endregion
1356
- }
296
isset( $r->upgrade_notice ) &&
297
strlen( trim( $r->upgrade_notice ) ) > 0
298
) {
299
+ $slug = $this->_fs->get_slug();
300
+
301
$upgrade_notice_html = sprintf(
302
+ '<p class="notice fs-upgrade-notice fs-slug-%1s fs-type-%2s" data-slug="%1s" data-type="%2s"><strong>%3s</strong> %4s</p>',
303
+ $slug,
304
+ $this->_fs->get_module_type(),
305
+ fs_text_inline( 'Important Upgrade Notice:', 'upgrade_notice', $slug ),
306
esc_html( $r->upgrade_notice )
307
);
308
1246
static function _store_basename_for_source_adjustment( $response, $hook_extra ) {
1247
if ( isset( $hook_extra['plugin'] ) ) {
1248
self::$_upgrade_basename = $hook_extra['plugin'];
1249
+ } else if ( isset( $hook_extra['theme'] ) ) {
1250
self::$_upgrade_basename = $hook_extra['theme'];
1251
} else {
1252
self::$_upgrade_basename = null;
1357
}
1358
1359
#endregion
1360
+ }
freemius/includes/class-fs-storage.php CHANGED
@@ -132,9 +132,8 @@
132
* @param int $blog_id
133
*/
134
function set_site_blog_context( $blog_id ) {
135
$this->_blog_id = $blog_id;
136
-
137
- $this->_storage = $this->get_site_storage( $this->_blog_id );
138
}
139
140
/**
132
* @param int $blog_id
133
*/
134
function set_site_blog_context( $blog_id ) {
135
+ $this->_storage = $this->get_site_storage( $blog_id );
136
$this->_blog_id = $blog_id;
137
}
138
139
/**
freemius/includes/fs-core-functions.php CHANGED
@@ -86,9 +86,25 @@
86
function fs_asset_url( $asset_abs_path ) {
87
$wp_content_dir = fs_normalize_path( WP_CONTENT_DIR );
88
$asset_abs_path = fs_normalize_path( $asset_abs_path );
89
- $asset_rel_path = str_replace( $wp_content_dir, '', $asset_abs_path );
90
91
- $asset_url = content_url( fs_normalize_path( $asset_rel_path ) );
92
93
return $asset_url;
94
}
@@ -709,6 +725,97 @@
709
return $key;
710
}
711
712
/**
713
* Get a translatable text override if exists, or `false`.
714
*
@@ -746,7 +853,9 @@
746
747
return false;
748
}
749
750
/**
751
* Get a translatable text and its text domain.
752
*
@@ -776,9 +885,9 @@
776
777
return array( $text, $text_domain );
778
}
779
780
- #region Private
781
-
782
/**
783
* Retrieve an inline translated text by key.
784
*
@@ -801,33 +910,9 @@
801
802
return $fn( $text, $text_domain );
803
}
804
805
- /**
806
- * Retrieve an inline translated text by key with a context.
807
- *
808
- * @author Vova Feldman (@svovaf)
809
- * @since 1.2.3
810
- *
811
- * @param string $text Translatable string.
812
- * @param string $context Context information for the translators.
813
- * @param string $key String key for overrides.
814
- * @param string $slug Module slug for overrides.
815
- *
816
- * @return string
817
- *
818
- * @global $fs_text_overrides
819
- */
820
- function _fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) {
821
- list( $text, $text_domain ) = fs_text_and_domain( $text, $key, $slug );
822
-
823
- // Avoid misleading Theme Check warning.
824
- $fn = 'translate_with_gettext_context';
825
-
826
- return $fn( $text, $context, $text_domain );
827
- }
828
-
829
- #endregion
830
-
831
/**
832
* Retrieve an inline translated text by key.
833
*
@@ -845,67 +930,6 @@
845
function fs_text_inline( $text, $key = '', $slug = 'freemius' ) {
846
return _fs_text_inline( $text, $key, $slug );
847
}
848
-
849
- /**
850
- * Retrieve an inline translated text by key with a context.
851
- *
852
- * @author Vova Feldman (@svovaf)
853
- * @since 1.2.3
854
- *
855
- * @param string $text Translatable string.
856
- * @param string $context Context information for the translators.
857
- * @param string $key String key for overrides.
858
- * @param string $slug Module slug for overrides.
859
- *
860
- * @return string
861
- *
862
- * @global $fs_text_overrides
863
- */
864
- function fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) {
865
- return _fs_text_x_inline( $text, $context, $key, $slug );
866
- }
867
-
868
- /**
869
- * Output a translated text by key.
870
- *
871
- * @author Vova Feldman (@svovaf)
872
- * @since 1.2.1.7
873
- *
874
- * @param string $key
875
- * @param string $slug
876
- */
877
- function fs_echo( $key, $slug = 'freemius' ) {
878
- echo fs_text( $key, $slug );
879
- }
880
-
881
- /**
882
- * Output an inline translated text.
883
- *
884
- * @author Vova Feldman (@svovaf)
885
- * @since 1.2.3
886
- *
887
- * @param string $text Translatable string.
888
- * @param string $key String key for overrides.
889
- * @param string $slug Module slug for overrides.
890
- */
891
- function fs_echo_inline( $text, $key = '', $slug = 'freemius' ) {
892
- echo _fs_text_inline( $text, $key, $slug );
893
- }
894
-
895
- /**
896
- * Output an inline translated text with a context.
897
- *
898
- * @author Vova Feldman (@svovaf)
899
- * @since 1.2.3
900
- *
901
- * @param string $text Translatable string.
902
- * @param string $context Context information for the translators.
903
- * @param string $key String key for overrides.
904
- * @param string $slug Module slug for overrides.
905
- */
906
- function fs_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) {
907
- echo _fs_text_x_inline( $text, $context, $key, $slug );
908
- }
909
}
910
911
if ( ! function_exists( 'fs_esc_attr' ) ) {
86
function fs_asset_url( $asset_abs_path ) {
87
$wp_content_dir = fs_normalize_path( WP_CONTENT_DIR );
88
$asset_abs_path = fs_normalize_path( $asset_abs_path );
89
90
+ if ( 0 === strpos( $asset_abs_path, $wp_content_dir ) ) {
91
+ // Handle both theme and plugin assets located in the standard directories.
92
+ $asset_rel_path = str_replace( $wp_content_dir, '', $asset_abs_path );
93
+ $asset_url = content_url( fs_normalize_path( $asset_rel_path ) );
94
+ } else {
95
+ $wp_plugins_dir = fs_normalize_path( WP_PLUGIN_DIR );
96
+ if ( 0 === strpos( $asset_abs_path, $wp_plugins_dir ) ) {
97
+ // Try to handle plugin assets that may be located in a non-standard plugins directory.
98
+ $asset_rel_path = str_replace( $wp_plugins_dir, '', $asset_abs_path );
99
+ $asset_url = plugins_url( fs_normalize_path( $asset_rel_path ) );
100
+ } else {
101
+ // Try to handle theme assets that may be located in a non-standard themes directory.
102
+ $active_theme_stylesheet = get_stylesheet();
103
+ $wp_themes_dir = fs_normalize_path( trailingslashit( get_theme_root( $active_theme_stylesheet ) ) );
104
+ $asset_rel_path = str_replace( $wp_themes_dir, '', fs_normalize_path( $asset_abs_path ) );
105
+ $asset_url = trailingslashit( get_theme_root_uri( $active_theme_stylesheet ) ) . fs_normalize_path( $asset_rel_path );
106
+ }
107
+ }
108
109
return $asset_url;
110
}
725
return $key;
726
}
727
728
+ #region Private
729
+
730
+ /**
731
+ * Retrieve an inline translated text by key with a context.
732
+ *
733
+ * @author Vova Feldman (@svovaf)
734
+ * @since 1.2.3
735
+ *
736
+ * @param string $text Translatable string.
737
+ * @param string $context Context information for the translators.
738
+ * @param string $key String key for overrides.
739
+ * @param string $slug Module slug for overrides.
740
+ *
741
+ * @return string
742
+ *
743
+ * @global $fs_text_overrides
744
+ */
745
+ function _fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) {
746
+ list( $text, $text_domain ) = fs_text_and_domain( $text, $key, $slug );
747
+
748
+ // Avoid misleading Theme Check warning.
749
+ $fn = 'translate_with_gettext_context';
750
+
751
+ return $fn( $text, $context, $text_domain );
752
+ }
753
+
754
+ #endregion
755
+
756
+ /**
757
+ * Retrieve an inline translated text by key with a context.
758
+ *
759
+ * @author Vova Feldman (@svovaf)
760
+ * @since 1.2.3
761
+ *
762
+ * @param string $text Translatable string.
763
+ * @param string $context Context information for the translators.
764
+ * @param string $key String key for overrides.
765
+ * @param string $slug Module slug for overrides.
766
+ *
767
+ * @return string
768
+ *
769
+ * @global $fs_text_overrides
770
+ */
771
+ function fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) {
772
+ return _fs_text_x_inline( $text, $context, $key, $slug );
773
+ }
774
+
775
+ /**
776
+ * Output a translated text by key.
777
+ *
778
+ * @author Vova Feldman (@svovaf)
779
+ * @since 1.2.1.7
780
+ *
781
+ * @param string $key
782
+ * @param string $slug
783
+ */
784
+ function fs_echo( $key, $slug = 'freemius' ) {
785
+ echo fs_text( $key, $slug );
786
+ }
787
+
788
+ /**
789
+ * Output an inline translated text.
790
+ *
791
+ * @author Vova Feldman (@svovaf)
792
+ * @since 1.2.3
793
+ *
794
+ * @param string $text Translatable string.
795
+ * @param string $key String key for overrides.
796
+ * @param string $slug Module slug for overrides.
797
+ */
798
+ function fs_echo_inline( $text, $key = '', $slug = 'freemius' ) {
799
+ echo _fs_text_inline( $text, $key, $slug );
800
+ }
801
+
802
+ /**
803
+ * Output an inline translated text with a context.
804
+ *
805
+ * @author Vova Feldman (@svovaf)
806
+ * @since 1.2.3
807
+ *
808
+ * @param string $text Translatable string.
809
+ * @param string $context Context information for the translators.
810
+ * @param string $key String key for overrides.
811
+ * @param string $slug Module slug for overrides.
812
+ */
813
+ function fs_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) {
814
+ echo _fs_text_x_inline( $text, $context, $key, $slug );
815
+ }
816
+ }
817
+
818
+ if ( ! function_exists( 'fs_text_override' ) ) {
819
/**
820
* Get a translatable text override if exists, or `false`.
821
*
853
854
return false;
855
}
856
+ }
857
858
+ if ( ! function_exists( 'fs_text_and_domain' ) ) {
859
/**
860
* Get a translatable text and its text domain.
861
*
885
886
return array( $text, $text_domain );
887
}
888
+ }
889
890
+ if ( ! function_exists( '_fs_text_inline' ) ) {
891
/**
892
* Retrieve an inline translated text by key.
893
*
910
911
return $fn( $text, $text_domain );
912
}
913
+ }
914
915
+ if ( ! function_exists( 'fs_text_inline' ) ) {
916
/**
917
* Retrieve an inline translated text by key.
918
*
930
function fs_text_inline( $text, $key = '', $slug = 'freemius' ) {
931
return _fs_text_inline( $text, $key, $slug );
932
}
933
}
934
935
if ( ! function_exists( 'fs_esc_attr' ) ) {
freemius/includes/managers/class-fs-admin-menu-manager.php CHANGED
@@ -181,11 +181,6 @@
181
182
// @deprecated
183
$this->_type = $this->get_option( $menu, 'type', 'page' );
184
-
185
- $this->_first_time_path = $this->get_option( $menu, 'first-path', false );
186
- if ( ! empty( $this->_first_time_path ) && is_string( $this->_first_time_path ) ) {
187
- $this->_first_time_path = admin_url( $this->_first_time_path, 'admin' );
188
- }
189
}
190
191
$this->_is_override_exact = $this->get_bool_option( $menu, 'override_exact' );
@@ -208,6 +203,11 @@
208
// 'page'
209
// ) );
210
}
211
}
212
}
213
181
182
// @deprecated
183
$this->_type = $this->get_option( $menu, 'type', 'page' );
184
}
185
186
$this->_is_override_exact = $this->get_bool_option( $menu, 'override_exact' );
203
// 'page'
204
// ) );
205
}
206
+
207
+ $this->_first_time_path = $this->get_option( $menu, 'first-path', false );
208
+ if ( ! empty( $this->_first_time_path ) && is_string( $this->_first_time_path ) ) {
209
+ $this->_first_time_path = admin_url( $this->_first_time_path, 'admin' );
210
+ }
211
}
212
}
213
freemius/includes/managers/class-fs-admin-notice-manager.php CHANGED
@@ -219,6 +219,9 @@
219
return;
220
}
221
222
foreach ( $this->_notices as $id => $msg ) {
223
if ( isset( $msg['wp_user_id'] ) && is_numeric( $msg['wp_user_id'] ) ) {
224
if ( get_current_user_id() != $msg['wp_user_id'] ) {
@@ -261,7 +264,7 @@
261
$show_notice = call_user_func_array( 'fs_apply_filter', array(
262
$this->_module_unique_affix,
263
'show_admin_notice',
264
- true,
265
$msg
266
) );
267
@@ -287,6 +290,34 @@
287
fs_enqueue_local_style( 'fs_common', '/admin/common.css' );
288
}
289
290
/**
291
* Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked.
292
*
219
return;
220
}
221
222
+
223
+ $show_admin_notices = ( ! $this->is_gutenberg_page() );
224
+
225
foreach ( $this->_notices as $id => $msg ) {
226
if ( isset( $msg['wp_user_id'] ) && is_numeric( $msg['wp_user_id'] ) ) {
227
if ( get_current_user_id() != $msg['wp_user_id'] ) {
264
$show_notice = call_user_func_array( 'fs_apply_filter', array(
265
$this->_module_unique_affix,
266
'show_admin_notice',
267
+ $show_admin_notices,
268
$msg
269
) );
270
290
fs_enqueue_local_style( 'fs_common', '/admin/common.css' );
291
}
292
293
+ /**
294
+ * Check if the current page is the Gutenberg block editor.
295
+ *
296
+ * @author Vova Feldman (@svovaf)
297
+ * @since 2.2.3
298
+ *
299
+ * @return bool
300
+ */
301
+ function is_gutenberg_page() {
302
+ if ( function_exists( 'is_gutenberg_page' ) &&
303
+ is_gutenberg_page()
304
+ ) {
305
+ // The Gutenberg plugin is on.
306
+ return true;
307
+ }
308
+
309
+ $current_screen = get_current_screen();
310
+
311
+ if ( method_exists( $current_screen, 'is_block_editor' ) &&
312
+ $current_screen->is_block_editor()
313
+ ) {
314
+ // Gutenberg page on 5+.
315
+ return true;
316
+ }
317
+
318
+ return false;
319
+ }
320
+
321
/**
322
* Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked.
323
*
freemius/languages/freemius-da_DK.po CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2018 freemius
2
# This file is distributed under the same license as the freemius package.
3
# Translators:
4
# Joachim Jensen, 2016-2018
@@ -22,772 +22,772 @@ msgstr ""
22
"X-Poedit-SearchPathExcluded-0: *.js\n"
23
"X-Poedit-SourceCharset: UTF-8\n"
24
25
- #: includes/class-freemius.php:1602
26
msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
27
msgstr "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
28
29
- #: includes/class-freemius.php:1604
30
msgid "Error"
31
msgstr "Fejl"
32
33
- #: includes/class-freemius.php:1925
34
msgid "I found a better %s"
35
msgstr "Jeg fandt et bedre %s"
36
37
- #: includes/class-freemius.php:1927
38
msgid "What's the %s's name?"
39
msgstr "Hvad er navnet på %s?"
40
41
- #: includes/class-freemius.php:1933
42
msgid "It's a temporary %s. I'm just debugging an issue."
43
msgstr "Det er en midlertidig %s. Jeg er i gang med fejlrettelser."
44
45
- #: includes/class-freemius.php:1935
46
msgid "Deactivation"
47
msgstr "Deaktivering"
48
49
- #: includes/class-freemius.php:1936
50
msgid "Theme Switch"
51
msgstr "Temaskift"
52
53
- #: includes/class-freemius.php1945, templates/forms/resend-key.php:24
54
msgid "Other"
55
msgstr "Andet"
56
57
- #: includes/class-freemius.php:1953
58
msgid "I no longer need the %s"
59
msgstr "Jeg har ikke længere brug for %s"
60
61
- #: includes/class-freemius.php:1960
62
msgid "I only needed the %s for a short period"
63
msgstr "Jeg behøvede kun %s i en kort periode"
64
65
- #: includes/class-freemius.php:1966
66
msgid "The %s broke my site"
67
msgstr "%s ødelagde min webside"
68
69
- #: includes/class-freemius.php:1973
70
msgid "The %s suddenly stopped working"
71
msgstr "%s stoppede pludseligt med at virke"
72
73
- #: includes/class-freemius.php:1983
74
msgid "I can't pay for it anymore"
75
msgstr "Jeg kan ikke længere betale for det"
76
77
- #: includes/class-freemius.php:1985
78
msgid "What price would you feel comfortable paying?"
79
msgstr "Hvilken pris ville du foretrække at betale?"
80
81
- #: includes/class-freemius.php:1991
82
msgid "I don't like to share my information with you"
83
msgstr "Jeg har ikke lyst til at dele mine informationer med jer"
84
85
- #: includes/class-freemius.php:2012
86
msgid "The %s didn't work"
87
msgstr "%s virkede ikke"
88
89
- #: includes/class-freemius.php:2022
90
msgid "I couldn't understand how to make it work"
91
msgstr "Jeg forstod ikke, hvordan jeg skulle få det til at fungere."
92
93
- #: includes/class-freemius.php:2030
94
msgid "The %s is great, but I need specific feature that you don't support"
95
msgstr "%s er godt, men jeg har brug for en specifik feature, som ikke understøttes"
96
97
- #: includes/class-freemius.php:2032
98
msgid "What feature?"
99
msgstr "Hvilken feature?"
100
101
- #: includes/class-freemius.php:2036
102
msgid "The %s is not working"
103
msgstr "%s virker ikke"
104
105
- #: includes/class-freemius.php:2038
106
msgid "Kindly share what didn't work so we can fix it for future users..."
107
msgstr "Kindly share what didn't work so we can fix it for future users..."
108
109
- #: includes/class-freemius.php:2042
110
msgid "It's not what I was looking for"
111
msgstr "Det er ikke, hvad jeg søgte"
112
113
- #: includes/class-freemius.php:2044
114
msgid "What you've been looking for?"
115
msgstr "Hvad har du ledt efter?"
116
117
- #: includes/class-freemius.php:2048
118
msgid "The %s didn't work as expected"
119
msgstr "%s virkede ikke som forventet"
120
121
- #: includes/class-freemius.php:2050
122
msgid "What did you expect?"
123
msgstr "Hvad forventede du?"
124
125
- #: includes/class-freemius.php2853, templates/debug.php:20
126
msgid "Freemius Debug"
127
msgstr "Freemius Debug"
128
129
- #: includes/class-freemius.php:3581
130
msgid "I don't know what is cURL or how to install it, help me!"
131
msgstr "Jeg ved ikke hvad cURL er, eller hvordan jeg installerer det. Hjælp mig!"
132
133
- #: includes/class-freemius.php:3583
134
msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update."
135
msgstr "Vi vil kontakte din udbyder og løse problemet. Når vi har opdatinger i sagen, vil vi følge op med en email til dig på %s."
136
137
- #: includes/class-freemius.php:3590
138
msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
139
msgstr "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
140
141
- #: includes/class-freemius.php:3695
142
msgid "Yes - do your thing"
143
msgstr "Ja - fortsæt bare"
144
145
- #: includes/class-freemius.php:3700
146
msgid "No - just deactivate"
147
msgstr "Nej - bare deaktiver"
148
149
- #: includes/class-freemius.php3745, includes/class-freemius.php4253,
150
- #: includes/class-freemius.php5318, includes/class-freemius.php11316,
151
- #: includes/class-freemius.php14649, includes/class-freemius.php14701,
152
- #: includes/class-freemius.php14763, includes/class-freemius.php16969,
153
- #: includes/class-freemius.php16979, includes/class-freemius.php17588,
154
- #: includes/class-freemius.php18446, includes/class-freemius.php18561,
155
- #: includes/class-freemius.php18705, templates/add-ons.php:43
156
msgctxt "exclamation"
157
msgid "Oops"
158
msgstr "Ups"
159
160
- #: includes/class-freemius.php:3814
161
msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience."
162
msgstr "Tak fordi du giver os en chance for at fixe det! En besked er lige blevet sendt til vores tekniske personale. Vi vil vende tilbage, så snart der er nyt om %s. Vi sætter pris på din tålmodighed."
163
164
- #: includes/class-freemius.php:4250
165
msgctxt "addonX cannot run without pluginY"
166
msgid "%s cannot run without %s."
167
msgstr "%s virker ikke uden %s."
168
169
- #: includes/class-freemius.php:4251
170
msgctxt "addonX cannot run..."
171
msgid "%s cannot run without the plugin."
172
msgstr "%s virker ikke uden pluginnet."
173
174
- #: includes/class-freemius.php4363, includes/class-freemius.php4388,
175
- #: includes/class-freemius.php:17659
176
msgid "Unexpected API error. Please contact the %s's author with the following error."
177
msgstr "Unexpected API error. Please contact the %s's author with the following error."
178
179
- #: includes/class-freemius.php:5006
180
msgid "Premium %s version was successfully activated."
181
msgstr "Premium-versionen af %s blev aktiveret."
182
183
- #: includes/class-freemius.php5018, includes/class-freemius.php:6862
184
msgctxt ""
185
msgid "W00t"
186
msgstr "W00t"
187
188
- #: includes/class-freemius.php:5033
189
msgid "You have a %s license."
190
msgstr "Du har en %s licens."
191
192
- #: includes/class-freemius.php5037, includes/class-freemius.php14070,
193
- #: includes/class-freemius.php14081, includes/class-freemius.php16897,
194
- #: includes/class-freemius.php17197, includes/class-freemius.php17263,
195
- #: includes/class-freemius.php:17413
196
msgctxt "interjection expressing joy or exuberance"
197
msgid "Yee-haw"
198
msgstr "Yee-haw"
199
200
- #: includes/class-freemius.php:5301
201
msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
202
msgstr "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
203
204
- #: includes/class-freemius.php:5305
205
msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
206
msgstr "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
207
208
- #: includes/class-freemius.php5314, templates/add-ons.php103,
209
#: templates/account/partials/addon.php:288
210
msgid "More information about %s"
211
msgstr "Mere information om %s"
212
213
- #: includes/class-freemius.php:5315
214
msgid "Purchase License"
215
msgstr "Køb licens"
216
217
- #: includes/class-freemius.php6230, templates/connect.php:163
218
msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
219
msgstr "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
220
221
- #: includes/class-freemius.php:6234
222
msgid "start the trial"
223
msgstr "start prøveperioden"
224
225
- #: includes/class-freemius.php6235, templates/connect.php:167
226
msgid "complete the install"
227
msgstr "færdiggør installeringen"
228
229
- #: includes/class-freemius.php:6348
230
msgid "You are just one step away - %s"
231
msgstr "Du mangler kun ét skridt - %s"
232
233
- #: includes/class-freemius.php:6351
234
msgctxt "%s - plugin name. As complete \"PluginX\" activation now"
235
msgid "Complete \"%s\" Activation Now"
236
msgstr "Færdiggør aktivering af \"%s\" nu"
237
238
- #: includes/class-freemius.php:6429
239
msgid "We made a few tweaks to the %s, %s"
240
msgstr "Vi har foretaget nogle rettelser til %s, %s"
241
242
- #: includes/class-freemius.php:6433
243
msgid "Opt in to make \"%s\" better!"
244
msgstr "Opt in to make \"%s\" better!"
245
246
- #: includes/class-freemius.php:6861
247
msgid "The upgrade of %s was successfully completed."
248
msgstr "Opgraderingen af %s blev fuldendt."
249
250
- #: includes/class-freemius.php8705, includes/class-fs-plugin-updater.php882,
251
- #: includes/class-fs-plugin-updater.php1077,
252
- #: includes/class-fs-plugin-updater.php1084,
253
#: templates/auto-installation.php:32
254
msgid "Add-On"
255
msgstr "Tilføjelse"
256
257
- #: includes/class-freemius.php8707, templates/debug.php359,
258
#: templates/debug.php:520
259
msgid "Plugin"
260
msgstr "Plugin"
261
262
- #: includes/class-freemius.php8708, templates/debug.php359,
263
#: templates/debug.php520, templates/forms/deactivation/form.php:67
264
msgid "Theme"
265
msgstr "Tema"
266
267
- #: includes/class-freemius.php:11183
268
msgid "Invalid site details collection."
269
msgstr "Invalid site details collection."
270
271
- #: includes/class-freemius.php:11303
272
msgid "We couldn't find your email address in the system, are you sure it's the right address?"
273
msgstr "Vi kunne ikke finde din e-mailadresse i systemet, er du sikker på, det er den rigtige adresse?"
274
275
- #: includes/class-freemius.php:11305
276
msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?"
277
msgstr "Vi kan ikke finde nogen aktive licenser knyttet til den e-mailadresse, er du sikker på, det er den rigtige adresse?"
278
279
- #: includes/class-freemius.php:11541
280
msgid "Account is pending activation."
281
msgstr "Konto afventer aktivering."
282
283
- #: includes/class-freemius.php11653,
284
#: templates/forms/premium-versions-upgrade-handler.php:47
285
msgid "Buy a license now"
286
msgstr "Buy a license now"
287
288
- #: includes/class-freemius.php11665,
289
#: templates/forms/premium-versions-upgrade-handler.php:46
290
msgid "Renew your license now"
291
msgstr "Renew your license now"
292
293
- #: includes/class-freemius.php:11669
294
msgid "%s to access version %s security & feature updates, and support."
295
msgstr "%s to access version %s security & feature updates, and support."
296
297
- #: includes/class-freemius.php:14052
298
msgid "%s activation was successfully completed."
299
msgstr "Aktivering af %s blev gennemført."
300
301
- #: includes/class-freemius.php:14066
302
msgid "Your account was successfully activated with the %s plan."
303
msgstr "Din konto blev aktiveret med planen %s."
304
305
- #: includes/class-freemius.php14077, includes/class-freemius.php:17259
306
msgid "Your trial has been successfully started."
307
msgstr "Din prøveperiode er begyndt."
308
309
- #: includes/class-freemius.php14647, includes/class-freemius.php14699,
310
- #: includes/class-freemius.php:14761
311
msgid "Couldn't activate %s."
312
msgstr "Kunne ikke aktivere %s."
313
314
- #: includes/class-freemius.php14648, includes/class-freemius.php14700,
315
- #: includes/class-freemius.php:14762
316
msgid "Please contact us with the following message:"
317
msgstr "Kontakt os venligst med følgende besked:"
318
319
- #: includes/class-freemius.php15111, includes/class-freemius.php:19543
320
msgid "Upgrade"
321
msgstr "Opgrader"
322
323
- #: includes/class-freemius.php:15117
324
msgid "Start Trial"
325
msgstr "Start prøveperiode"
326
327
- #: includes/class-freemius.php:15119
328
msgid "Pricing"
329
msgstr "Priser"
330
331
- #: includes/class-freemius.php15181, includes/class-freemius.php:15183
332
msgid "Affiliation"
333
msgstr "Affiliation"
334
335
- #: includes/class-freemius.php15211, includes/class-freemius.php15213,
336
#: templates/account.php150, templates/debug.php:324
337
msgid "Account"
338
msgstr "Konto"
339
340
- #: includes/class-freemius.php15226, includes/class-freemius.php15228,
341
#: includes/customizer/class-fs-customizer-support-section.php:60
342
msgid "Contact Us"
343
msgstr "Kontakt os"
344
345
- #: includes/class-freemius.php15238, includes/class-freemius.php15240,
346
- #: includes/class-freemius.php19553, templates/account.php100,
347
#: templates/account/partials/addon.php:41
348
msgid "Add-Ons"
349
msgstr "Tilføjelser"
350
351
- #: includes/class-freemius.php:15274
352
msgctxt "ASCII arrow left icon"
353
msgid "&#x2190;"
354
msgstr "&#x2190;"
355
356
- #: includes/class-freemius.php:15274
357
msgctxt "ASCII arrow right icon"
358
msgid "&#x27a4;"
359
msgstr "&#x27a4;"
360
361
- #: includes/class-freemius.php15276, templates/pricing.php:97
362
msgctxt "noun"
363
msgid "Pricing"
364
msgstr "Priser"
365
366
- #: includes/class-freemius.php15479,
367
#: includes/customizer/class-fs-customizer-support-section.php:67
368
msgid "Support Forum"
369
msgstr "Supportforum"
370
371
- #: includes/class-freemius.php:16265
372
msgid "Your email has been successfully verified - you are AWESOME!"
373
msgstr "Din e-mailadresse er blevet verificeret - du er FOR SEJ!"
374
375
- #: includes/class-freemius.php:16266
376
msgctxt "a positive response"
377
msgid "Right on"
378
msgstr "Sådan"
379
380
- #: includes/class-freemius.php:16888
381
msgid "Your %s Add-on plan was successfully upgraded."
382
msgstr "Your %s Add-on plan was successfully upgraded."
383
384
- #: includes/class-freemius.php:16890
385
msgid "%s Add-on was successfully purchased."
386
msgstr "Betalingen for tilføjelsen %s blev gennemført."
387
388
- #: includes/class-freemius.php:16893
389
msgid "Download the latest version"
390
msgstr "Download den seneste version"
391
392
- #: includes/class-freemius.php:16965
393
msgctxt "%1s - plugin title, %2s - API domain"
394
msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s"
395
msgstr "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s"
396
397
- #: includes/class-freemius.php16968, includes/class-freemius.php17384,
398
- #: includes/class-freemius.php:17461
399
msgid "Error received from the server:"
400
msgstr "Fejl modtager fra serveren:"
401
402
- #: includes/class-freemius.php:16978
403
msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again."
404
msgstr "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again."
405
406
- #: includes/class-freemius.php17160, includes/class-freemius.php17389,
407
- #: includes/class-freemius.php17432, includes/class-freemius.php:17535
408
msgctxt ""
409
msgid "Hmm"
410
msgstr "Hmm"
411
412
- #: includes/class-freemius.php:17173
413
msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry."
414
msgstr "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry."
415
416
- #: includes/class-freemius.php17174, templates/account.php102,
417
#: templates/add-ons.php134, templates/account/partials/addon.php:43
418
msgctxt "trial period"
419
msgid "Trial"
420
msgstr "Prøveperiode"
421
422
- #: includes/class-freemius.php:17179
423
msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s."
424
msgstr "Jeg har opgraderet min konto, men når jeg forsøger at synkronisere licensen, forbliver planen %s."
425
426
- #: includes/class-freemius.php17183, includes/class-freemius.php:17241
427
msgid "Please contact us here"
428
msgstr "Kontakt os her"
429
430
- #: includes/class-freemius.php:17193
431
msgid "Your plan was successfully upgraded."
432
msgstr "Din plan er blevet opgraderet."
433
434
- #: includes/class-freemius.php:17211
435
msgid "Your plan was successfully changed to %s."
436
msgstr "Din plan er blevet ændret til %s."
437
438
- #: includes/class-freemius.php:17227
439
msgid "Your license has expired. You can still continue using the free %s forever."
440
msgstr "Din licens er udløbet. Du kan stadig fortsætte med at benytte den gratis udgave af %s."
441
442
- #: includes/class-freemius.php:17229
443
msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
444
msgstr "Din licens er udløbet. %1$sOpgrader nu%2$s for at fortsætte med at benytte %3$s uden forstyrrelser."
445
446
- #: includes/class-freemius.php:17237
447
msgid "Your license has been cancelled. If you think it's a mistake, please contact support."
448
msgstr "Din licens er blevet annulleret. Hvis du mener, dette er en fejl, så kontakt venligst support."
449
450
- #: includes/class-freemius.php:17250
451
msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support."
452
msgstr "Din licens er udløbet. Du kan stadig benytte alle funktionerne i %s, men du bliver nødt til at fornye din licens for at få opdateringer og support."
453
454
- #: includes/class-freemius.php:17273
455
msgid "Your free trial has expired. You can still continue using all our free features."
456
msgstr "Din gratis prøveperiode er udløbet. Du kan stadig benytte alle de gratis features."
457
458
- #: includes/class-freemius.php:17275
459
msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
460
msgstr "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
461
462
- #: includes/class-freemius.php:17380
463
msgid "It looks like the license could not be activated."
464
msgstr "Det ser ud til, at licensen ikke kunne aktiveres."
465
466
- #: includes/class-freemius.php:17410
467
msgid "Your license was successfully activated."
468
msgstr "Din licens er blevet aktiveret."
469
470
- #: includes/class-freemius.php:17436
471
msgid "It looks like your site currently doesn't have an active license."
472
msgstr "Det ser ud til, at dit websted endnu ikke har en aktiv licens."
473
474
- #: includes/class-freemius.php:17460
475
msgid "It looks like the license deactivation failed."
476
msgstr "Det ser ud til, at licens-deaktiveringen mislykkedes."
477
478
- #: includes/class-freemius.php:17488
479
msgid "Your license was successfully deactivated, you are back to the %s plan."
480
msgstr "Din licens blev deaktiveret, du er tilbage på planen %s."
481
482
- #: includes/class-freemius.php:17489
483
msgid "O.K"
484
msgstr "O.K"
485
486
- #: includes/class-freemius.php:17542
487
msgid "Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes."
488
msgstr "Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes."
489
490
- #: includes/class-freemius.php:17551
491
msgid "Your subscription was successfully cancelled. Your %s plan license will expire in %s."
492
msgstr "Your subscription was successfully cancelled. Your %s plan license will expire in %s."
493
494
- #: includes/class-freemius.php:17593
495
msgid "You are already running the %s in a trial mode."
496
msgstr "Du benytter allerede %s under en prøveperiode."
497
498
- #: includes/class-freemius.php:17604
499
msgid "You already utilized a trial before."
500
msgstr "Du har allerede brugt din prøveperiode."
501
502
- #: includes/class-freemius.php:17618
503
msgid "Plan %s do not exist, therefore, can't start a trial."
504
msgstr "Plan %s eksisterer ikke og kan derfor ikke starte prøveperiode."
505
506
- #: includes/class-freemius.php:17629
507
msgid "Plan %s does not support a trial period."
508
msgstr "Plan %s understøtter ikke en prøveperiode."
509
510
- #: includes/class-freemius.php:17640
511
msgid "None of the %s's plans supports a trial period."
512
msgstr "None of the %s's plans supports a trial period."
513
514
- #: includes/class-freemius.php:17690
515
msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)"
516
msgstr "Det lader ikke til du er i en prøveperiode længere, så der er ikke noget at annullere :-)"
517
518
- #: includes/class-freemius.php:17726
519
msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes."
520
msgstr "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes."
521
522
- #: includes/class-freemius.php:17745
523
msgid "Your %s free trial was successfully cancelled."
524
msgstr "Din gratis prøveperiode for %s er blevet annulleret."
525
526
- #: includes/class-freemius.php:18052
527
msgid "Version %s was released."
528
msgstr "Version %s er blevet udgivet."
529
530
- #: includes/class-freemius.php:18052
531
msgid "Please download %s."
532
msgstr "Download venligst %s."
533
534
- #: includes/class-freemius.php:18059
535
msgid "the latest %s version here"
536
msgstr "den seneste version af %s her"
537
538
- #: includes/class-freemius.php:18064
539
msgid "New"
540
msgstr "Ny"
541
542
- #: includes/class-freemius.php:18069
543
msgid "Seems like you got the latest release."
544
msgstr "Det ser ud til, at du har den seneste udgivelse."
545
546
- #: includes/class-freemius.php:18070
547
msgid "You are all good!"
548
msgstr "Det var det!"
549
550
- #: includes/class-freemius.php:18338
551
msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box."
552
msgstr "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box."
553
554
- #: includes/class-freemius.php:18473
555
msgid "Site successfully opted in."
556
msgstr "Websted er tilmeldt."
557
558
- #: includes/class-freemius.php18474, includes/class-freemius.php:19285
559
msgid "Awesome"
560
msgstr "Sejt"
561
562
- #: includes/class-freemius.php18490, templates/forms/optout.php:32
563
msgid "We appreciate your help in making the %s better by letting us track some usage data."
564
msgstr "Vi sætter pris på din hjælp med at forbedre %s ved at lade os indsamle brugsdata."
565
566
- #: includes/class-freemius.php:18491
567
msgid "Thank you!"
568
msgstr "Mange tak!"
569
570
- #: includes/class-freemius.php:18498
571
msgid "We will no longer be sending any usage data of %s on %s to %s."
572
msgstr "Vi vil ikke længere indsende brugsdata af %s på %s til %s."
573
574
- #: includes/class-freemius.php:18627
575
msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder."
576
msgstr "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder."
577
578
- #: includes/class-freemius.php:18633
579
msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval."
580
msgstr "Thanks for confirming the ownership change. An email was just sent to %s for final approval."
581
582
- #: includes/class-freemius.php:18638
583
msgid "%s is the new owner of the account."
584
msgstr "%s er den nye ejer af kontoen."
585
586
- #: includes/class-freemius.php:18640
587
msgctxt "as congratulations"
588
msgid "Congrats"
589
msgstr "Tillykke"
590
591
- #: includes/class-freemius.php:18660
592
msgid "Sorry, we could not complete the email update. Another user with the same email is already registered."
593
msgstr "Sorry, we could not complete the email update. Another user with the same email is already registered."
594
595
- #: includes/class-freemius.php:18661
596
msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button."
597
msgstr "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button."
598
599
- #: includes/class-freemius.php:18668
600
msgid "Change Ownership"
601
msgstr "Skift ejerskab"
602
603
- #: includes/class-freemius.php:18676
604
msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments."
605
msgstr "Your email was successfully updated. You should receive an email with confirmation instructions in few moments."
606
607
- #: includes/class-freemius.php:18688
608
msgid "Please provide your full name."
609
msgstr "Indtast venligst dit fulde navn."
610
611
- #: includes/class-freemius.php:18693
612
msgid "Your name was successfully updated."
613
msgstr "Dit navn er blevet opdateret."
614
615
- #: includes/class-freemius.php:18754
616
msgid "You have successfully updated your %s."
617
msgstr "Opdatering af %s blev gennemført."
618
619
- #: includes/class-freemius.php:18894
620
msgid "Just letting you know that the add-ons information of %s is being pulled from an external server."
621
msgstr "Just letting you know that the add-ons information of %s is being pulled from an external server."
622
623
- #: includes/class-freemius.php:18895
624
msgctxt "advance notice of something that will need attention."
625
msgid "Heads up"
626
msgstr "Se her"
627
628
- #: includes/class-freemius.php:19325
629
msgctxt "exclamation"
630
msgid "Hey"
631
msgstr "Hey"
632
633
- #: includes/class-freemius.php:19325
634
msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial."
635
msgstr "Hvad syntes du om %s indtil videre? Test alle %s premium funktioner med en %d-dags gratis prøveperiode."
636
637
- #: includes/class-freemius.php:19333
638
msgid "No commitment for %s days - cancel anytime!"
639
msgstr "Ingen bindinger i %s dage - annuller når som helst!"
640
641
- #: includes/class-freemius.php:19334
642
msgid "No credit card required"
643
msgstr "Betalingskort ikke påkrævet"
644
645
- #: includes/class-freemius.php19341, templates/forms/trial-start.php:53
646
msgctxt "call to action"
647
msgid "Start free trial"
648
msgstr "Start gratis prøveperiode"
649
650
- #: includes/class-freemius.php:19418
651
msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!"
652
msgstr "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!"
653
654
- #: includes/class-freemius.php:19427
655
msgid "Learn more"
656
msgstr "Læs mere"
657
658
- #: includes/class-freemius.php19577, templates/account.php406,
659
#: templates/account.php509, templates/connect.php171,
660
#: templates/connect.php421, templates/forms/license-activation.php24,
661
#: templates/account/partials/addon.php:235
662
msgid "Activate License"
663
msgstr "Aktiver licens"
664
665
- #: includes/class-freemius.php19578, templates/account.php469,
666
#: templates/account.php508, templates/account/partials/site.php:256
667
msgid "Change License"
668
msgstr "Skift licens"
669
670
- #: includes/class-freemius.php19660, templates/account/partials/site.php:161
671
msgid "Opt Out"
672
msgstr "Frameld"
673
674
- #: includes/class-freemius.php19662, includes/class-freemius.php19667,
675
#: templates/account/partials/site.php43,
676
#: templates/account/partials/site.php:161
677
msgid "Opt In"
678
msgstr "Tilmeld"
679
680
- #: includes/class-freemius.php:19891
681
msgid " The paid version of %1s is already installed. Please activate it to start benefiting the %2s features. %3s"
682
msgstr " The paid version of %1s is already installed. Please activate it to start benefiting the %2s features. %3s"
683
684
- #: includes/class-freemius.php:19899
685
msgid "Activate %s features"
686
msgstr "Activate %s features"
687
688
- #: includes/class-freemius.php:19912
689
msgid "Please follow these steps to complete the upgrade"
690
msgstr "Følg venligst disse trin for at færdiggøre opgraderingen"
691
692
- #: includes/class-freemius.php:19916
693
msgid "Download the latest %s version"
694
msgstr "Download den seneste version af %s"
695
696
- #: includes/class-freemius.php:19920
697
msgid "Upload and activate the downloaded version"
698
msgstr "Upload og aktiver den downloadede version"
699
700
- #: includes/class-freemius.php:19922
701
msgid "How to upload and activate?"
702
msgstr "Upload og aktivering, hvordan?"
703
704
- #: includes/class-freemius.php:20056
705
msgid "%sClick here%s to choose the sites where you'd like to activate the license on."
706
msgstr "%sClick here%s to choose the sites where you'd like to activate the license on."
707
708
- #: includes/class-freemius.php:20217
709
msgid "Auto installation only works for opted-in users."
710
msgstr "Auto-installation fungerer kun for tilmeldte brugere."
711
712
- #: includes/class-freemius.php20227, includes/class-freemius.php20260,
713
- #: includes/class-fs-plugin-updater.php1056,
714
- #: includes/class-fs-plugin-updater.php:1070
715
msgid "Invalid module ID."
716
msgstr "Ugyldigt modul-ID."
717
718
- #: includes/class-freemius.php20236, includes/class-fs-plugin-updater.php:1092
719
msgid "Premium version already active."
720
msgstr "Premium version allerede aktiv."
721
722
- #: includes/class-freemius.php:20243
723
msgid "You do not have a valid license to access the premium version."
724
msgstr "Du har ikke en gyldig licens til at benytte premium-versionen."
725
726
- #: includes/class-freemius.php:20250
727
msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version."
728
msgstr "Plugin is a \"Serviceware\" which means it does not have a premium code version."
729
730
- #: includes/class-freemius.php20268, includes/class-fs-plugin-updater.php:1091
731
msgid "Premium add-on version already installed."
732
msgstr "Premium tilføjelse er allerede installeret."
733
734
- #: includes/class-freemius.php:20613
735
msgid "View paid features"
736
msgstr "Vis betalte features"
737
738
- #: includes/class-freemius.php:20927
739
msgid "Thank you so much for using %s and its add-ons!"
740
msgstr "Thank you so much for using %s and its add-ons!"
741
742
- #: includes/class-freemius.php:20928
743
msgid "Thank you so much for using %s!"
744
msgstr "Tak fordi du benytter %s!"
745
746
- #: includes/class-freemius.php:20934
747
msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s."
748
msgstr "Du er allerede tilmeldt vores brugssporing, hvilket hjælper os med at forbedre %s."
749
750
- #: includes/class-freemius.php:20938
751
msgid "Thank you so much for using our products!"
752
msgstr "Mange tak for at benytte vores produkter!"
753
754
- #: includes/class-freemius.php:20939
755
msgid "You've already opted-in to our usage-tracking, which helps us keep improving them."
756
msgstr "Du er allerede tilmeldt vores brugssporing, hvilket hjælper os med at forbedre dem."
757
758
- #: includes/class-freemius.php:20958
759
msgid "%s and its add-ons"
760
msgstr "%s og tilføjelser"
761
762
- #: includes/class-freemius.php:20967
763
msgid "Products"
764
msgstr "Produkter"
765
766
- #: includes/class-freemius.php20974, templates/connect.php:272
767
msgid "Yes"
768
msgstr "Ja"
769
770
- #: includes/class-freemius.php20975, templates/connect.php:273
771
msgid "send me security & feature updates, educational content and offers."
772
msgstr "send mig sikkerheds- og feature-opdateringer, informativt indhold og tilbud."
773
774
- #: includes/class-freemius.php20976, templates/connect.php:278
775
msgid "No"
776
msgstr "Nej"
777
778
- #: includes/class-freemius.php20978, templates/connect.php:280
779
msgid "do %sNOT%s send me security & feature updates, educational content and offers."
780
msgstr "send %sIKKE%s sikkerheds- og feature-opdateringer, informativt indhold og tilbud."
781
782
- #: includes/class-freemius.php:20988
783
msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂"
784
msgstr "Grundet krav i den nye %sEU General Data Protection Regulation (GDPR)%s, er det nødvendigt at du igen giver dit udtrykkelige samtykke og bekræfter, at du er ombord 🙂"
785
786
- #: includes/class-freemius.php20990, templates/connect.php:287
787
msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:"
788
msgstr "Lad os vide, om vi har lov til at kontakte dig med sikkerheds- og feature-opdateringer, informativt indhold og lejlighedsvise tilbud:"
789
790
- #: includes/class-freemius.php:21272
791
msgid "License key is empty."
792
msgstr "Licensnøglen er tom."
793
@@ -809,19 +809,19 @@ msgstr "There is a %s of %s available."
809
msgid "new version"
810
msgstr "new version"
811
812
- #: includes/class-fs-plugin-updater.php:301
813
msgid "Important Upgrade Notice:"
814
msgstr "Important Upgrade Notice:"
815
816
- #: includes/class-fs-plugin-updater.php:1121
817
msgid "Installing plugin: %s"
818
msgstr "Installerer plugin: %s"
819
820
- #: includes/class-fs-plugin-updater.php:1162
821
msgid "Unable to connect to the filesystem. Please confirm your credentials."
822
msgstr "Unable to connect to the filesystem. Please confirm your credentials."
823
824
- #: includes/class-fs-plugin-updater.php:1335
825
msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work."
826
msgstr "The remote plugin package does not contain a folder with the desired slug and renaming did not work."
827
1
+ # Copyright (C) 2019 freemius
2
# This file is distributed under the same license as the freemius package.
3
# Translators:
4
# Joachim Jensen, 2016-2018
22
"X-Poedit-SearchPathExcluded-0: *.js\n"
23
"X-Poedit-SourceCharset: UTF-8\n"
24
25
+ #: includes/class-freemius.php:1688
26
msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
27
msgstr "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
28
29
+ #: includes/class-freemius.php:1690
30
msgid "Error"
31
msgstr "Fejl"
32
33
+ #: includes/class-freemius.php:2011
34
msgid "I found a better %s"
35
msgstr "Jeg fandt et bedre %s"
36
37
+ #: includes/class-freemius.php:2013
38
msgid "What's the %s's name?"
39
msgstr "Hvad er navnet på %s?"
40
41
+ #: includes/class-freemius.php:2019
42
msgid "It's a temporary %s. I'm just debugging an issue."
43
msgstr "Det er en midlertidig %s. Jeg er i gang med fejlrettelser."
44
45
+ #: includes/class-freemius.php:2021
46
msgid "Deactivation"
47
msgstr "Deaktivering"
48
49
+ #: includes/class-freemius.php:2022
50
msgid "Theme Switch"
51
msgstr "Temaskift"
52
53
+ #: includes/class-freemius.php2031, templates/forms/resend-key.php:24
54
msgid "Other"
55
msgstr "Andet"
56
57
+ #: includes/class-freemius.php:2039
58
msgid "I no longer need the %s"
59
msgstr "Jeg har ikke længere brug for %s"
60
61
+ #: includes/class-freemius.php:2046
62
msgid "I only needed the %s for a short period"
63
msgstr "Jeg behøvede kun %s i en kort periode"
64
65
+ #: includes/class-freemius.php:2052
66
msgid "The %s broke my site"
67
msgstr "%s ødelagde min webside"
68
69
+ #: includes/class-freemius.php:2059
70
msgid "The %s suddenly stopped working"
71
msgstr "%s stoppede pludseligt med at virke"
72
73
+ #: includes/class-freemius.php:2069
74
msgid "I can't pay for it anymore"
75
msgstr "Jeg kan ikke længere betale for det"
76
77
+ #: includes/class-freemius.php:2071
78
msgid "What price would you feel comfortable paying?"
79
msgstr "Hvilken pris ville du foretrække at betale?"
80
81
+ #: includes/class-freemius.php:2077
82
msgid "I don't like to share my information with you"
83
msgstr "Jeg har ikke lyst til at dele mine informationer med jer"
84
85
+ #: includes/class-freemius.php:2098
86
msgid "The %s didn't work"
87
msgstr "%s virkede ikke"
88
89
+ #: includes/class-freemius.php:2108
90
msgid "I couldn't understand how to make it work"
91
msgstr "Jeg forstod ikke, hvordan jeg skulle få det til at fungere."
92
93
+ #: includes/class-freemius.php:2116
94
msgid "The %s is great, but I need specific feature that you don't support"
95
msgstr "%s er godt, men jeg har brug for en specifik feature, som ikke understøttes"
96
97
+ #: includes/class-freemius.php:2118
98
msgid "What feature?"
99
msgstr "Hvilken feature?"
100
101
+ #: includes/class-freemius.php:2122
102
msgid "The %s is not working"
103
msgstr "%s virker ikke"
104
105
+ #: includes/class-freemius.php:2124
106
msgid "Kindly share what didn't work so we can fix it for future users..."
107
msgstr "Kindly share what didn't work so we can fix it for future users..."
108
109
+ #: includes/class-freemius.php:2128
110
msgid "It's not what I was looking for"
111
msgstr "Det er ikke, hvad jeg søgte"
112
113
+ #: includes/class-freemius.php:2130
114
msgid "What you've been looking for?"
115
msgstr "Hvad har du ledt efter?"
116
117
+ #: includes/class-freemius.php:2134
118
msgid "The %s didn't work as expected"
119
msgstr "%s virkede ikke som forventet"
120
121
+ #: includes/class-freemius.php:2136
122
msgid "What did you expect?"
123
msgstr "Hvad forventede du?"
124
125
+ #: includes/class-freemius.php2942, templates/debug.php:20
126
msgid "Freemius Debug"
127
msgstr "Freemius Debug"
128
129
+ #: includes/class-freemius.php:3670
130
msgid "I don't know what is cURL or how to install it, help me!"
131
msgstr "Jeg ved ikke hvad cURL er, eller hvordan jeg installerer det. Hjælp mig!"
132
133
+ #: includes/class-freemius.php:3672
134
msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update."
135
msgstr "Vi vil kontakte din udbyder og løse problemet. Når vi har opdatinger i sagen, vil vi følge op med en email til dig på %s."
136
137
+ #: includes/class-freemius.php:3679
138
msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
139
msgstr "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
140
141
+ #: includes/class-freemius.php:3784
142
msgid "Yes - do your thing"
143
msgstr "Ja - fortsæt bare"
144
145
+ #: includes/class-freemius.php:3789
146
msgid "No - just deactivate"
147
msgstr "Nej - bare deaktiver"
148
149
+ #: includes/class-freemius.php3834, includes/class-freemius.php4343,
150
+ #: includes/class-freemius.php5442, includes/class-freemius.php11545,
151
+ #: includes/class-freemius.php14916, includes/class-freemius.php14968,
152
+ #: includes/class-freemius.php15030, includes/class-freemius.php17263,
153
+ #: includes/class-freemius.php17273, includes/class-freemius.php17882,
154
+ #: includes/class-freemius.php18742, includes/class-freemius.php18857,
155
+ #: includes/class-freemius.php19001, templates/add-ons.php:43
156
msgctxt "exclamation"
157
msgid "Oops"
158
msgstr "Ups"
159
160
+ #: includes/class-freemius.php:3903
161
msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience."
162
msgstr "Tak fordi du giver os en chance for at fixe det! En besked er lige blevet sendt til vores tekniske personale. Vi vil vende tilbage, så snart der er nyt om %s. Vi sætter pris på din tålmodighed."
163
164
+ #: includes/class-freemius.php:4340
165
msgctxt "addonX cannot run without pluginY"
166
msgid "%s cannot run without %s."
167
msgstr "%s virker ikke uden %s."
168
169
+ #: includes/class-freemius.php:4341
170
msgctxt "addonX cannot run..."
171
msgid "%s cannot run without the plugin."
172
msgstr "%s virker ikke uden pluginnet."
173
174
+ #: includes/class-freemius.php4487, includes/class-freemius.php4512,
175
+ #: includes/class-freemius.php:17953
176
msgid "Unexpected API error. Please contact the %s's author with the following error."
177
msgstr "Unexpected API error. Please contact the %s's author with the following error."
178
179
+ #: includes/class-freemius.php:5130
180
msgid "Premium %s version was successfully activated."
181
msgstr "Premium-versionen af %s blev aktiveret."
182
183
+ #: includes/class-freemius.php5142, includes/class-freemius.php:7004
184
msgctxt ""
185
msgid "W00t"
186
msgstr "W00t"
187
188
+ #: includes/class-freemius.php:5157
189
msgid "You have a %s license."
190
msgstr "Du har en %s licens."
191
192
+ #: includes/class-freemius.php5161, includes/class-freemius.php14337,
193
+ #: includes/class-freemius.php14348, includes/class-freemius.php17177,
194
+ #: includes/class-freemius.php17491, includes/class-freemius.php17557,
195
+ #: includes/class-freemius.php:17707
196
msgctxt "interjection expressing joy or exuberance"
197
msgid "Yee-haw"
198
msgstr "Yee-haw"
199
200
+ #: includes/class-freemius.php:5425
201
msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
202
msgstr "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
203
204
+ #: includes/class-freemius.php:5429
205
msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
206
msgstr "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
207
208
+ #: includes/class-freemius.php5438, templates/add-ons.php103,
209
#: templates/account/partials/addon.php:288
210
msgid "More information about %s"
211
msgstr "Mere information om %s"
212
213
+ #: includes/class-freemius.php:5439
214
msgid "Purchase License"
215
msgstr "Køb licens"
216
217
+ #: includes/class-freemius.php6372, templates/connect.php:163
218
msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
219
msgstr "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
220
221
+ #: includes/class-freemius.php:6376
222
msgid "start the trial"
223
msgstr "start prøveperioden"
224
225
+ #: includes/class-freemius.php6377, templates/connect.php:167
226
msgid "complete the install"
227
msgstr "færdiggør installeringen"
228
229
+ #: includes/class-freemius.php:6490
230
msgid "You are just one step away - %s"
231
msgstr "Du mangler kun ét skridt - %s"
232
233
+ #: includes/class-freemius.php:6493
234
msgctxt "%s - plugin name. As complete \"PluginX\" activation now"
235
msgid "Complete \"%s\" Activation Now"
236
msgstr "Færdiggør aktivering af \"%s\" nu"
237
238
+ #: includes/class-freemius.php:6571
239
msgid "We made a few tweaks to the %s, %s"
240
msgstr "Vi har foretaget nogle rettelser til %s, %s"
241
242
+ #: includes/class-freemius.php:6575
243
msgid "Opt in to make \"%s\" better!"
244
msgstr "Opt in to make \"%s\" better!"
245
246
+ #: includes/class-freemius.php:7003
247
msgid "The upgrade of %s was successfully completed."
248
msgstr "Opgraderingen af %s blev fuldendt."
249
250
+ #: includes/class-freemius.php8925, includes/class-fs-plugin-updater.php886,
251
+ #: includes/class-fs-plugin-updater.php1081,
252
+ #: includes/class-fs-plugin-updater.php1088,
253
#: templates/auto-installation.php:32
254
msgid "Add-On"
255
msgstr "Tilføjelse"
256
257
+ #: includes/class-freemius.php8927, templates/debug.php359,
258
#: templates/debug.php:520
259
msgid "Plugin"
260
msgstr "Plugin"
261
262
+ #: includes/class-freemius.php8928, templates/debug.php359,
263
#: templates/debug.php520, templates/forms/deactivation/form.php:67
264
msgid "Theme"
265
msgstr "Tema"
266
267
+ #: includes/class-freemius.php:11412
268
msgid "Invalid site details collection."
269
msgstr "Invalid site details collection."
270
271
+ #: includes/class-freemius.php:11532
272
msgid "We couldn't find your email address in the system, are you sure it's the right address?"
273
msgstr "Vi kunne ikke finde din e-mailadresse i systemet, er du sikker på, det er den rigtige adresse?"
274
275
+ #: includes/class-freemius.php:11534
276
msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?"
277
msgstr "Vi kan ikke finde nogen aktive licenser knyttet til den e-mailadresse, er du sikker på, det er den rigtige adresse?"
278
279
+ #: includes/class-freemius.php:11808
280
msgid "Account is pending activation."
281
msgstr "Konto afventer aktivering."
282
283
+ #: includes/class-freemius.php11920,
284
#: templates/forms/premium-versions-upgrade-handler.php:47
285
msgid "Buy a license now"
286
msgstr "Buy a license now"
287
288
+ #: includes/class-freemius.php11932,
289
#: templates/forms/premium-versions-upgrade-handler.php:46
290
msgid "Renew your license now"
291
msgstr "Renew your license now"
292
293
+ #: includes/class-freemius.php:11936
294
msgid "%s to access version %s security & feature updates, and support."
295
msgstr "%s to access version %s security & feature updates, and support."
296
297
+ #: includes/class-freemius.php:14319
298
msgid "%s activation was successfully completed."
299
msgstr "Aktivering af %s blev gennemført."
300
301
+ #: includes/class-freemius.php:14333
302
msgid "Your account was successfully activated with the %s plan."
303
msgstr "Din konto blev aktiveret med planen %s."
304
305
+ #: includes/class-freemius.php14344, includes/class-freemius.php:17553
306
msgid "Your trial has been successfully started."
307
msgstr "Din prøveperiode er begyndt."
308
309
+ #: includes/class-freemius.php14914, includes/class-freemius.php14966,
310
+ #: includes/class-freemius.php:15028
311
msgid "Couldn't activate %s."
312
msgstr "Kunne ikke aktivere %s."
313
314
+ #: includes/class-freemius.php14915, includes/class-freemius.php14967,
315
+ #: includes/class-freemius.php:15029
316
msgid "Please contact us with the following message:"
317
msgstr "Kontakt os venligst med følgende besked:"
318
319
+ #: includes/class-freemius.php15378, includes/class-freemius.php:19839
320
msgid "Upgrade"
321
msgstr "Opgrader"
322
323
+ #: includes/class-freemius.php:15384
324
msgid "Start Trial"
325
msgstr "Start prøveperiode"
326
327
+ #: includes/class-freemius.php:15386
328
msgid "Pricing"
329
msgstr "Priser"
330
331
+ #: includes/class-freemius.php15448, includes/class-freemius.php:15450
332
msgid "Affiliation"
333
msgstr "Affiliation"
334
335
+ #: includes/class-freemius.php15478, includes/class-freemius.php15480,
336
#: templates/account.php150, templates/debug.php:324
337
msgid "Account"
338
msgstr "Konto"
339
340
+ #: includes/class-freemius.php15493, includes/class-freemius.php15495,
341
#: includes/customizer/class-fs-customizer-support-section.php:60
342
msgid "Contact Us"
343
msgstr "Kontakt os"
344
345
+ #: includes/class-freemius.php15505, includes/class-freemius.php15507,
346
+ #: includes/class-freemius.php19849, templates/account.php100,
347
#: templates/account/partials/addon.php:41
348
msgid "Add-Ons"
349
msgstr "Tilføjelser"
350
351
+ #: includes/class-freemius.php:15541
352
msgctxt "ASCII arrow left icon"
353
msgid "&#x2190;"
354
msgstr "&#x2190;"
355
356
+ #: includes/class-freemius.php:15541
357
msgctxt "ASCII arrow right icon"
358
msgid "&#x27a4;"
359
msgstr "&#x27a4;"
360
361
+ #: includes/class-freemius.php15543, templates/pricing.php:97
362
msgctxt "noun"
363
msgid "Pricing"
364