From dd0a8b69b166fd4413907af4df2ed72efea565a2 Mon Sep 17 00:00:00 2001 From: Lai Power Date: Tue, 28 Jul 2026 15:05:31 +0000 Subject: [PATCH] modified file `upgrade-temp-backup` --- .../plugins/activitypub/LICENSE | 22 + .../plugins/activitypub/activitypub.php | 182 + .../assets/css/activitypub-admin-bar.css | 7 + .../assets/css/activitypub-admin.css | 414 ++ .../assets/css/activitypub-embed.css | 157 + .../assets/css/activitypub-post-preview.css | 201 + .../assets/css/activitypub-welcome.css | 310 ++ .../activitypub/assets/img/follow-me.png | Bin 0 -> 21868 bytes .../activitypub/assets/img/followers.png | Bin 0 -> 27519 bytes .../plugins/activitypub/assets/img/mp.jpg | Bin 0 -> 2741 bytes .../activitypub/assets/img/reactions.png | Bin 0 -> 63099 bytes .../plugins/activitypub/assets/img/reply.png | Bin 0 -> 47774 bytes .../activitypub/assets/img/wp-logo.png | Bin 0 -> 8269 bytes .../assets/js/activitypub-admin.js | 20 + .../assets/js/activitypub-connected-apps.js | 364 ++ .../assets/js/activitypub-following.js | 129 + .../assets/js/activitypub-header-image.js | 271 ++ .../assets/js/activitypub-moderation-admin.js | 440 ++ .../plugins/activitypub/build/app/block.json | 11 + .../build/app/feed-content.85282751.js | 5 + .../build/app/feed-route.20fab139.js | 1 + .../activitypub/build/app/index.asset.php | 1 + .../plugins/activitypub/build/app/index.js | 4 + .../build/app/style-feed-content-rtl.css | 4 + .../build/app/style-feed-content.css | 4 + .../activitypub/build/app/style-index-rtl.css | 10 + .../activitypub/build/app/style-index.css | 10 + .../build/app/tanstack-router.asset.php | 1 + .../activitypub/build/app/tanstack-router.js | 1 + .../activitypub/build/app/vendors.asset.php | 1 + .../plugins/activitypub/build/app/vendors.js | 176 + .../build/command-palette/block.json | 11 + .../build/command-palette/plugin.asset.php | 1 + .../build/command-palette/plugin.js | 3 + .../build/dashboard-stats/block.json | 10 + .../build/dashboard-stats/index.asset.php | 1 + .../build/dashboard-stats/index.js | 4 + .../build/dashboard-stats/style-index-rtl.css | 1 + .../build/dashboard-stats/style-index.css | 1 + .../build/editor-plugin/block.json | 11 + .../build/editor-plugin/plugin.asset.php | 1 + .../activitypub/build/editor-plugin/plugin.js | 2 + .../activitypub/build/extra-fields/block.json | 78 + .../build/extra-fields/index.asset.php | 1 + .../activitypub/build/extra-fields/index.js | 2 + .../activitypub/build/extra-fields/render.php | 81 + .../build/extra-fields/style-index-rtl.css | 1 + .../build/extra-fields/style-index.css | 1 + .../activitypub/build/follow-me/block.json | 83 + .../build/follow-me/index.asset.php | 1 + .../activitypub/build/follow-me/index.js | 2 + .../activitypub/build/follow-me/render.php | 255 ++ .../build/follow-me/style-index-rtl.css | 1 + .../build/follow-me/style-index.css | 1 + .../build/follow-me/view.asset.php | 1 + .../activitypub/build/follow-me/view.js | 1 + .../activitypub/build/followers/block.json | 66 + .../build/followers/index.asset.php | 1 + .../activitypub/build/followers/index.js | 3 + .../activitypub/build/followers/render.php | 20 + .../build/followers/style-index-rtl.css | 1 + .../build/followers/style-index.css | 1 + .../build/followers/view.asset.php | 1 + .../activitypub/build/followers/view.js | 1 + .../activitypub/build/following/block.json | 66 + .../build/following/index.asset.php | 1 + .../activitypub/build/following/index.js | 3 + .../activitypub/build/following/render.php | 20 + .../build/following/style-index-rtl.css | 1 + .../build/following/style-index.css | 1 + .../build/following/view.asset.php | 1 + .../activitypub/build/following/view.js | 1 + .../build/posts-and-replies/block.json | 26 + .../build/posts-and-replies/index.asset.php | 1 + .../build/posts-and-replies/index.js | 1 + .../build/posts-and-replies/render.php | 54 + .../posts-and-replies/style-index-rtl.css | 1 + .../build/posts-and-replies/style-index.css | 1 + .../build/pre-publish-panel/block.json | 11 + .../build/pre-publish-panel/plugin.asset.php | 1 + .../build/pre-publish-panel/plugin.js | 3 + .../activitypub/build/reactions/block.json | 76 + .../build/reactions/index.asset.php | 1 + .../activitypub/build/reactions/index.js | 4 + .../activitypub/build/reactions/render.php | 418 ++ .../build/reactions/style-index-rtl.css | 1 + .../build/reactions/style-index.css | 1 + .../build/reactions/view.asset.php | 1 + .../activitypub/build/reactions/view.css | 1 + .../activitypub/build/reactions/view.js | 1 + .../activitypub/build/remote-reply/block.json | 20 + .../activitypub/build/remote-reply/render.php | 215 + .../build/remote-reply/style-view.css | 1 + .../build/remote-reply/view.asset.php | 1 + .../activitypub/build/remote-reply/view.js | 1 + .../activitypub/build/reply-intent/block.json | 11 + .../build/reply-intent/plugin.asset.php | 1 + .../activitypub/build/reply-intent/plugin.js | 1 + .../activitypub/build/reply/block.json | 44 + .../activitypub/build/reply/index-rtl.css | 1 + .../activitypub/build/reply/index.asset.php | 1 + .../plugins/activitypub/build/reply/index.css | 1 + .../plugins/activitypub/build/reply/index.js | 1 + .../activitypub/build/stats/block.json | 54 + .../activitypub/build/stats/index.asset.php | 1 + .../plugins/activitypub/build/stats/index.js | 1 + .../activitypub/build/stats/render.php | 239 ++ .../build/stats/style-index-rtl.css | 1 + .../activitypub/build/stats/style-index.css | 1 + .../includes/activity/class-activity.php | 314 ++ .../includes/activity/class-actor.php | 372 ++ .../includes/activity/class-base-object.php | 674 ++++ .../activity/class-generic-object.php | 381 ++ .../activity/extended-object/README.md | 5 + .../activity/extended-object/class-event.php | 415 ++ .../activity/extended-object/class-place.php | 119 + .../class-quote-authorization.php | 70 + .../includes/cache/class-avatar.php | 172 + .../includes/cache/class-emoji.php | 184 + .../activitypub/includes/cache/class-file.php | 671 ++++ .../includes/cache/class-media.php | 191 + .../includes/cache/class-stats-image.php | 684 ++++ .../includes/class-activitypub.php | 400 ++ .../includes/class-attachments.php | 759 ++++ .../activitypub/includes/class-autoloader.php | 106 + .../activitypub/includes/class-avatars.php | 87 + .../class-blocklist-subscriptions.php | 222 ++ .../activitypub/includes/class-blocks.php | 1329 +++++++ .../activitypub/includes/class-cache.php | 91 + .../activitypub/includes/class-cli.php | 127 + .../activitypub/includes/class-comment.php | 1038 +++++ .../activitypub/includes/class-dispatcher.php | 578 +++ .../activitypub/includes/class-embed.php | 305 ++ .../activitypub/includes/class-emoji.php | 277 ++ .../includes/class-event-stream.php | 61 + .../activitypub/includes/class-handler.php | 70 + .../activitypub/includes/class-hashtag.php | 158 + .../activitypub/includes/class-http.php | 316 ++ .../activitypub/includes/class-link.php | 129 + .../activitypub/includes/class-mailer.php | 550 +++ .../activitypub/includes/class-mention.php | 150 + .../activitypub/includes/class-migration.php | 1333 +++++++ .../activitypub/includes/class-moderation.php | 426 ++ .../activitypub/includes/class-move.php | 319 ++ .../includes/class-notification.php | 85 + .../activitypub/includes/class-options.php | 741 ++++ .../activitypub/includes/class-post-types.php | 1022 +++++ .../activitypub/includes/class-query.php | 436 ++ .../activitypub/includes/class-relay.php | 81 + .../activitypub/includes/class-router.php | 383 ++ .../activitypub/includes/class-sanitize.php | 560 +++ .../activitypub/includes/class-scheduler.php | 653 +++ .../activitypub/includes/class-search.php | 143 + .../activitypub/includes/class-shortcodes.php | 493 +++ .../activitypub/includes/class-signature.php | 567 +++ .../activitypub/includes/class-statistics.php | 970 +++++ .../activitypub/includes/class-tombstone.php | 446 +++ .../activitypub/includes/class-webfinger.php | 402 ++ .../includes/cli/class-actor-command.php | 77 + .../includes/cli/class-cache-command.php | 274 ++ .../includes/cli/class-command.php | 33 + .../includes/cli/class-comment-command.php | 95 + .../includes/cli/class-fetch-command.php | 221 ++ .../includes/cli/class-follow-command.php | 51 + .../includes/cli/class-move-command.php | 54 + .../includes/cli/class-outbox-command.php | 100 + .../includes/cli/class-post-command.php | 86 + .../cli/class-self-destruct-command.php | 302 ++ .../includes/cli/class-stats-command.php | 230 ++ .../includes/collection/class-actors.php | 852 ++++ .../collection/class-blocked-actors.php | 209 + .../collection/class-extra-fields.php | 304 ++ .../includes/collection/class-followers.php | 704 ++++ .../includes/collection/class-following.php | 639 +++ .../includes/collection/class-inbox.php | 556 +++ .../collection/class-interactions.php | 542 +++ .../includes/collection/class-outbox.php | 601 +++ .../includes/collection/class-posts.php | 221 ++ .../collection/class-remote-actors.php | 861 ++++ .../collection/class-remote-posts.php | 623 +++ .../includes/collection/class-replies.php | 222 ++ .../plugins/activitypub/includes/compat.php | 103 + .../activitypub/includes/constants.php | 116 + .../includes/functions-activity.php | 337 ++ .../includes/functions-comment.php | 238 ++ .../includes/functions-federation.php | 258 ++ .../activitypub/includes/functions-media.php | 225 ++ .../activitypub/includes/functions-post.php | 403 ++ .../includes/functions-request.php | 315 ++ .../activitypub/includes/functions-url.php | 167 + .../activitypub/includes/functions-user.php | 397 ++ .../activitypub/includes/functions.php | 433 ++ .../includes/handler/class-accept.php | 100 + .../includes/handler/class-announce.php | 133 + .../handler/class-collection-sync.php | 225 ++ .../includes/handler/class-create.php | 177 + .../includes/handler/class-delete.php | 367 ++ .../includes/handler/class-follow.php | 151 + .../includes/handler/class-like.php | 81 + .../includes/handler/class-move.php | 205 + .../includes/handler/class-quote-request.php | 336 ++ .../includes/handler/class-reject.php | 107 + .../includes/handler/class-undo.php | 85 + .../includes/handler/class-update.php | 168 + .../includes/handler/outbox/class-add.php | 95 + .../handler/outbox/class-announce.php | 49 + .../includes/handler/outbox/class-arrive.php | 187 + .../includes/handler/outbox/class-block.php | 62 + .../includes/handler/outbox/class-create.php | 121 + .../includes/handler/outbox/class-delete.php | 130 + .../includes/handler/outbox/class-follow.php | 44 + .../includes/handler/outbox/class-like.php | 49 + .../includes/handler/outbox/class-remove.php | 95 + .../includes/handler/outbox/class-undo.php | 116 + .../includes/handler/outbox/class-update.php | 114 + .../includes/model/class-application.php | 265 ++ .../activitypub/includes/model/class-blog.php | 604 +++ .../includes/model/class-follower.php | 359 ++ .../activitypub/includes/model/class-user.php | 486 +++ .../oauth/class-authorization-code.php | 327 ++ .../includes/oauth/class-client.php | 978 +++++ .../includes/oauth/class-scope.php | 190 + .../includes/oauth/class-server.php | 454 +++ .../includes/oauth/class-token.php | 933 +++++ .../rest/admin/class-actions-controller.php | 253 ++ .../admin/class-statistics-controller.php | 133 + .../includes/rest/class-actors-controller.php | 391 ++ .../rest/class-actors-inbox-controller.php | 421 ++ .../rest/class-application-controller.php | 183 + .../rest/class-collections-controller.php | 265 ++ .../rest/class-comments-controller.php | 168 + .../rest/class-followers-controller.php | 443 +++ .../rest/class-following-controller.php | 254 ++ .../includes/rest/class-inbox-controller.php | 538 +++ .../rest/class-interaction-controller.php | 205 + .../includes/rest/class-liked-controller.php | 223 ++ .../rest/class-moderators-controller.php | 167 + .../rest/class-nodeinfo-controller.php | 348 ++ .../includes/rest/class-outbox-controller.php | 691 ++++ .../includes/rest/class-post-controller.php | 265 ++ .../includes/rest/class-proxy-controller.php | 270 ++ .../rest/class-replies-controller.php | 265 ++ .../includes/rest/class-server.php | 238 ++ .../rest/class-stats-image-controller.php | 156 + .../rest/class-webfinger-controller.php | 172 + .../oauth/class-authorization-controller.php | 406 ++ .../rest/oauth/class-clients-controller.php | 186 + .../rest/oauth/class-token-controller.php | 432 ++ .../includes/rest/trait-collection.php | 163 + .../includes/rest/trait-event-stream.php | 573 +++ .../includes/rest/trait-language-map.php | 184 + .../includes/rest/trait-verification.php | 247 ++ .../includes/scheduler/class-actor.php | 204 + .../scheduler/class-collection-sync.php | 102 + .../includes/scheduler/class-comment.php | 126 + .../includes/scheduler/class-post.php | 231 ++ .../includes/scheduler/class-statistics.php | 345 ++ .../class-http-message-signature.php | 491 +++ .../signature/class-http-signature-draft.php | 394 ++ .../signature/interface-http-signature.php | 45 + .../transformer/class-activity-object.php | 157 + .../includes/transformer/class-attachment.php | 68 + .../includes/transformer/class-base.php | 736 ++++ .../includes/transformer/class-comment.php | 419 ++ .../includes/transformer/class-factory.php | 125 + .../includes/transformer/class-json.php | 41 + .../includes/transformer/class-post.php | 1215 ++++++ .../includes/transformer/class-term.php | 66 + .../includes/transformer/class-user.php | 35 + .../plugins/activitypub/integration/README.md | 3 + .../activitypub/integration/class-akismet.php | 40 + .../integration/class-buddypress.php | 124 + .../integration/class-classic-editor.php | 305 ++ .../class-enable-mastodon-apps.php | 1246 ++++++ .../activitypub/integration/class-jetpack.php | 175 + .../integration/class-litespeed-cache.php | 230 ++ .../class-multisite-language-switcher.php | 49 + .../integration/class-nodeinfo.php | 145 + .../integration/class-opengraph.php | 113 + .../class-podlove-podcast-publisher.php | 180 + .../class-seriously-simple-podcasting.php | 49 + .../activitypub/integration/class-surge.php | 206 + .../integration/class-webfinger.php | 150 + .../integration/class-wp-rest-cache.php | 148 + .../activitypub/integration/class-wpml.php | 44 + .../integration/class-yoast-seo.php | 178 + .../plugins/activitypub/integration/load.php | 234 ++ .../integration/stream/class-connector.php | 254 ++ .../integration/stream/class-stream.php | 58 + .../integration/surge-cache-config.php | 32 + .../activitypub/patterns/author-header.php | 27 + .../activitypub/patterns/author-profile.php | 31 + .../activitypub/patterns/follow-page.php | 45 + .../activitypub/patterns/following-page.php | 44 + .../activitypub/patterns/profile-page.php | 59 + .../activitypub/patterns/social-sidebar.php | 40 + .../activitypub/patterns/stats-post.php | 69 + .../plugins/activitypub/readme.txt | 349 ++ .../templates/activitypub-json.php | 25 + .../activitypub/templates/admin-header.php | 35 + .../templates/advanced-settings.php | 18 + .../templates/block-confirmation.php | 72 + .../templates/blocked-actors-list.php | 82 + .../activitypub/templates/blog-settings.php | 18 + .../bulk-actor-delete-confirmation.php | 62 + .../templates/bulk-block-confirmation.php | 88 + .../activitypub/templates/emails/new-dm.php | 49 + .../templates/emails/new-follower.php | 159 + .../templates/emails/new-mention.php | 68 + .../templates/emails/parts/footer.php | 28 + .../templates/emails/parts/header.php | 60 + .../templates/emails/stats-report.php | 219 + .../plugins/activitypub/templates/embed.php | 93 + .../activitypub/templates/followers-list.php | 50 + .../activitypub/templates/following-list.php | 95 + .../templates/help-tab/account-migration.php | 73 + .../templates/help-tab/core-features.php | 66 + .../templates/help-tab/editor-blocks.php | 97 + .../templates/help-tab/getting-started.php | 30 + .../templates/help-tab/glossary.php | 78 + .../templates/help-tab/resources.php | 46 + .../templates/help-tab/template-tags.php | 67 + .../templates/help-tab/troubleshooting.php | 51 + .../activitypub/templates/help-tab/users.php | 50 + .../activitypub/templates/oauth-authorize.php | 132 + .../activitypub/templates/oauth-error.php | 33 + .../activitypub/templates/post-preview.php | 162 + .../activitypub/templates/settings.php | 18 + .../activitypub/templates/tombstone-json.php | 51 + .../plugins/activitypub/templates/toolbox.php | 78 + .../plugins/activitypub/templates/welcome.php | 20 + .../plugins/wp-piwik/.editorconfig | 10 + .../plugins/wp-piwik/.gitignore | 5 + .../plugins/wp-piwik/LICENSE | 675 ++++ .../plugins/wp-piwik/README.md | 9 + .../plugins/wp-piwik/bitcoin.png | Bin 0 -> 2020 bytes .../plugins/wp-piwik/classes/WP_Piwik.php | 1601 ++++++++ .../classes/WP_Piwik/AIBotTracking.php | 234 ++ .../wp-piwik/classes/WP_Piwik/Admin.php | 34 + .../classes/WP_Piwik/Admin/Network.php | 16 + .../classes/WP_Piwik/Admin/Settings.php | 1301 ++++++ .../classes/WP_Piwik/Admin/Sitebrowser.php | 133 + .../classes/WP_Piwik/Admin/Statistics.php | 55 + .../wp-piwik/classes/WP_Piwik/AjaxTracker.php | 175 + .../wp-piwik/classes/WP_Piwik/Logger.php | 57 + .../classes/WP_Piwik/Logger/Dummy.php | 10 + .../wp-piwik/classes/WP_Piwik/Logger/File.php | 55 + .../classes/WP_Piwik/Logger/Screen.php | 27 + .../wp-piwik/classes/WP_Piwik/Request.php | 132 + .../wp-piwik/classes/WP_Piwik/Request/Php.php | 94 + .../classes/WP_Piwik/Request/Rest.php | 126 + .../wp-piwik/classes/WP_Piwik/Settings.php | 486 +++ .../wp-piwik/classes/WP_Piwik/Shortcode.php | 34 + .../wp-piwik/classes/WP_Piwik/Template.php | 45 + .../WP_Piwik/Template/MetaBoxCustomVars.php | 75 + .../classes/WP_Piwik/TrackingCode.php | 264 ++ .../wp-piwik/classes/WP_Piwik/Widget.php | 476 +++ .../WP_Piwik/Widget/BrowserDetails.php | 80 + .../classes/WP_Piwik/Widget/Browsers.php | 83 + .../classes/WP_Piwik/Widget/Chart.php | 100 + .../wp-piwik/classes/WP_Piwik/Widget/City.php | 83 + .../classes/WP_Piwik/Widget/Country.php | 83 + .../classes/WP_Piwik/Widget/Ecommerce.php | 53 + .../classes/WP_Piwik/Widget/Items.php | 55 + .../classes/WP_Piwik/Widget/ItemsCategory.php | 55 + .../classes/WP_Piwik/Widget/Keywords.php | 20 + .../classes/WP_Piwik/Widget/Models.php | 83 + .../classes/WP_Piwik/Widget/Noresult.php | 43 + .../classes/WP_Piwik/Widget/OptOut.php | 35 + .../classes/WP_Piwik/Widget/Overview.php | 77 + .../classes/WP_Piwik/Widget/Pages.php | 20 + .../classes/WP_Piwik/Widget/Plugins.php | 40 + .../wp-piwik/classes/WP_Piwik/Widget/Post.php | 95 + .../classes/WP_Piwik/Widget/Referrers.php | 20 + .../classes/WP_Piwik/Widget/Screens.php | 77 + .../classes/WP_Piwik/Widget/Search.php | 40 + .../wp-piwik/classes/WP_Piwik/Widget/Seo.php | 33 + .../classes/WP_Piwik/Widget/SystemDetails.php | 76 + .../classes/WP_Piwik/Widget/Systems.php | 76 + .../classes/WP_Piwik/Widget/Types.php | 84 + .../classes/WP_Piwik/Widget/Visitors.php | 100 + .../plugins/wp-piwik/composer.json | 20 + .../plugins/wp-piwik/composer.lock | 3529 +++++++++++++++++ .../plugins/wp-piwik/config.php | 11 + .../plugins/wp-piwik/css/index.php | 2 + .../plugins/wp-piwik/css/wp-piwik.css | 65 + .../plugins/wp-piwik/gpl-3.0.html | 692 ++++ .../plugins/wp-piwik/index.php | 1 + .../plugins/wp-piwik/js/chartjs/LICENSE.md | 9 + .../plugins/wp-piwik/js/chartjs/README.md | 36 + .../plugins/wp-piwik/js/chartjs/chart.min.js | 13 + .../plugins/wp-piwik/js/index.php | 2 + .../plugins/wp-piwik/js/wp-piwik.js | 4 + .../plugins/wp-piwik/languages/.tx/config | 9 + .../plugins/wp-piwik/languages/update.sh | 5 + .../wp-piwik/languages/wp-piwik-az_AZ.mo | Bin 0 -> 1418 bytes .../wp-piwik/languages/wp-piwik-az_AZ.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-be_BY.mo | Bin 0 -> 1798 bytes .../wp-piwik/languages/wp-piwik-be_BY.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-cs_CZ.mo | Bin 0 -> 474 bytes .../wp-piwik/languages/wp-piwik-cs_CZ.po | 1528 +++++++ .../wp-piwik/languages/wp-piwik-de_CH.mo | Bin 0 -> 445 bytes .../wp-piwik/languages/wp-piwik-de_CH.po | 1528 +++++++ .../wp-piwik/languages/wp-piwik-de_DE.mo | Bin 0 -> 34143 bytes .../wp-piwik/languages/wp-piwik-de_DE.po | 1530 +++++++ .../plugins/wp-piwik/languages/wp-piwik-el.mo | Bin 0 -> 38932 bytes .../plugins/wp-piwik/languages/wp-piwik-el.po | 1531 +++++++ .../wp-piwik/languages/wp-piwik-el_GR.mo | Bin 0 -> 13103 bytes .../wp-piwik/languages/wp-piwik-el_GR.po | 407 ++ .../wp-piwik/languages/wp-piwik-es_ES.mo | Bin 0 -> 7734 bytes .../wp-piwik/languages/wp-piwik-es_ES.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-fa_IR.mo | Bin 0 -> 9852 bytes .../wp-piwik/languages/wp-piwik-fa_IR.po | 1532 +++++++ .../wp-piwik/languages/wp-piwik-fr_FR.mo | Bin 0 -> 28250 bytes .../wp-piwik/languages/wp-piwik-fr_FR.po | 1532 +++++++ .../plugins/wp-piwik/languages/wp-piwik-hi.mo | Bin 0 -> 7471 bytes .../plugins/wp-piwik/languages/wp-piwik-hi.po | 1529 +++++++ .../wp-piwik/languages/wp-piwik-hu_HU.mo | Bin 0 -> 27582 bytes .../wp-piwik/languages/wp-piwik-hu_HU.po | 1530 +++++++ .../plugins/wp-piwik/languages/wp-piwik-id.mo | Bin 0 -> 880 bytes .../plugins/wp-piwik/languages/wp-piwik-id.po | 1528 +++++++ .../wp-piwik/languages/wp-piwik-it_IT.mo | Bin 0 -> 26692 bytes .../wp-piwik/languages/wp-piwik-it_IT.po | 1532 +++++++ .../plugins/wp-piwik/languages/wp-piwik-lb.mo | Bin 0 -> 5705 bytes .../plugins/wp-piwik/languages/wp-piwik-lb.po | 1529 +++++++ .../wp-piwik/languages/wp-piwik-lt_LT.mo | Bin 0 -> 3031 bytes .../wp-piwik/languages/wp-piwik-lt_LT.po | 1531 +++++++ .../wp-piwik/languages/wp-piwik-nb_NO.mo | Bin 0 -> 5756 bytes .../wp-piwik/languages/wp-piwik-nb_NO.po | 1529 +++++++ .../wp-piwik/languages/wp-piwik-nl_NL.mo | Bin 0 -> 21847 bytes .../wp-piwik/languages/wp-piwik-nl_NL.po | 1532 +++++++ .../wp-piwik/languages/wp-piwik-pl_PL.mo | Bin 0 -> 26626 bytes .../wp-piwik/languages/wp-piwik-pl_PL.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-pt_BR.mo | Bin 0 -> 26913 bytes .../wp-piwik/languages/wp-piwik-pt_BR.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-ro_RO.mo | Bin 0 -> 1440 bytes .../wp-piwik/languages/wp-piwik-ro_RO.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-ru_RU.mo | Bin 0 -> 4820 bytes .../wp-piwik/languages/wp-piwik-ru_RU.po | 1529 +++++++ .../wp-piwik/languages/wp-piwik-sl_SI.mo | Bin 0 -> 1860 bytes .../wp-piwik/languages/wp-piwik-sl_SI.po | 1529 +++++++ .../plugins/wp-piwik/languages/wp-piwik-sq.mo | Bin 0 -> 27537 bytes .../plugins/wp-piwik/languages/wp-piwik-sq.po | 1532 +++++++ .../wp-piwik/languages/wp-piwik-sv_SE.mo | Bin 0 -> 1731 bytes .../wp-piwik/languages/wp-piwik-sv_SE.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-tr_TR.mo | Bin 0 -> 13468 bytes .../wp-piwik/languages/wp-piwik-tr_TR.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-ua_UA.mo | Bin 0 -> 4907 bytes .../wp-piwik/languages/wp-piwik-ua_UA.po | 186 + .../wp-piwik/languages/wp-piwik-uk_UA.mo | Bin 0 -> 1725 bytes .../wp-piwik/languages/wp-piwik-uk_UA.po | 1530 +++++++ .../wp-piwik/languages/wp-piwik-zh_CN.mo | Bin 0 -> 22777 bytes .../wp-piwik/languages/wp-piwik-zh_CN.po | 1529 +++++++ .../plugins/wp-piwik/languages/wp-piwik.pot | 1560 ++++++++ .../libs/matomo-php-tracker/.gitattributes | 2 + .../libs/matomo-php-tracker/.gitignore | 5 + .../libs/matomo-php-tracker/CHANGELOG.md | 30 + .../wp-piwik/libs/matomo-php-tracker/LICENSE | 27 + .../libs/matomo-php-tracker/MatomoTracker.php | 2664 +++++++++++++ .../libs/matomo-php-tracker/PiwikTracker.php | 51 + .../libs/matomo-php-tracker/README.md | 53 + .../libs/matomo-php-tracker/composer.json | 44 + .../libs/matomo-php-tracker/phpunit.xml.dist | 12 + .../plugins/wp-piwik/misc/track_ai_bot.php | 108 + .../plugins/wp-piwik/package-lock.json | 131 + .../plugins/wp-piwik/package.json | 12 + .../plugins/wp-piwik/proxy/config.php | 44 + .../plugins/wp-piwik/proxy/index.php | 2 + .../plugins/wp-piwik/proxy/matomo.php | 14 + .../plugins/wp-piwik/proxy/piwik.php | 3 + .../plugins/wp-piwik/proxy/proxy.php | 403 ++ .../plugins/wp-piwik/readme.txt | 738 ++++ .../plugins/wp-piwik/screenshot-1.gif | Bin 0 -> 47554 bytes .../plugins/wp-piwik/screenshot-2.gif | Bin 0 -> 52962 bytes .../plugins/wp-piwik/screenshot-3.gif | Bin 0 -> 97175 bytes .../plugins/wp-piwik/screenshot-4.gif | Bin 0 -> 11417 bytes .../plugins/wp-piwik/uninstall.php | 126 + .../plugins/wp-piwik/update/2015051101.php | 55 + .../plugins/wp-piwik/update/2017080701.php | 18 + .../plugins/wp-piwik/update/2021070701.php | 14 + .../plugins/wp-piwik/update/2023052301.php | 8 + .../plugins/wp-piwik/update/90001.php | 16 + .../plugins/wp-piwik/update/90801.php | 6 + .../plugins/wp-piwik/update/91006.php | 16 + .../plugins/wp-piwik/wp-piwik.php | 77 + .../plugins/wp-piwik/wpml-config.xml | 5 + 486 files changed, 123520 insertions(+) create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/LICENSE create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/activitypub.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin-bar.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-embed.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-post-preview.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-welcome.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/follow-me.png create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/followers.png create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/mp.jpg create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/reactions.png create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/reply.png create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/wp-logo.png create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-admin.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-connected-apps.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-following.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-header-image.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-moderation-admin.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/feed-content.85282751.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/feed-route.20fab139.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/style-feed-content-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/style-feed-content.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/tanstack-router.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/tanstack-router.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/vendors.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/app/vendors.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/command-palette/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/command-palette/plugin.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/command-palette/plugin.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/dashboard-stats/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/dashboard-stats/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/dashboard-stats/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/dashboard-stats/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/dashboard-stats/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/editor-plugin/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/editor-plugin/plugin.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/editor-plugin/plugin.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/extra-fields/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/extra-fields/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/extra-fields/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/extra-fields/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/extra-fields/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/extra-fields/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/view.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/view.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/view.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/following/view.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/style-view.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/view.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/view.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/block.json create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.asset.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.js create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/render.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index-rtl.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index.css create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-activity.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-actor.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-base-object.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-generic-object.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/README.md create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-event.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-place.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-quote-authorization.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-avatar.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-emoji.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-file.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-media.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-stats-image.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-activitypub.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-attachments.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-autoloader.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-avatars.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocklist-subscriptions.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocks.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-cache.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-cli.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-comment.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-dispatcher.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-embed.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-emoji.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-event-stream.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-handler.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-hashtag.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-http.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-link.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mailer.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mention.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-migration.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-moderation.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-move.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-notification.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-options.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-post-types.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-query.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-relay.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-router.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-sanitize.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-scheduler.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-search.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-shortcodes.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-signature.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-statistics.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-tombstone.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-webfinger.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-actor-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-cache-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-comment-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-fetch-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-follow-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-move-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-outbox-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-post-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-self-destruct-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/cli/class-stats-command.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-actors.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-blocked-actors.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-extra-fields.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-followers.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-following.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-inbox.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-interactions.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-outbox.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-posts.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-remote-actors.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-remote-posts.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/collection/class-replies.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/compat.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/constants.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-activity.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-comment.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-federation.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-media.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-post.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-request.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-url.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions-user.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/functions.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-accept.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-announce.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-collection-sync.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-create.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-delete.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-follow.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-like.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-move.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-quote-request.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-reject.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-undo.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/class-update.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-add.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-announce.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-arrive.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-block.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-create.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-delete.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-follow.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-like.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-remove.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-undo.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/handler/outbox/class-update.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/model/class-application.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/model/class-blog.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/model/class-follower.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/model/class-user.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/oauth/class-authorization-code.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/oauth/class-client.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/oauth/class-scope.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/oauth/class-server.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/oauth/class-token.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/admin/class-actions-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/admin/class-statistics-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-actors-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-actors-inbox-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-application-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-collections-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-comments-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-followers-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-following-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-inbox-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-interaction-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-liked-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-moderators-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-nodeinfo-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-outbox-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-post-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-proxy-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-replies-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-server.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-stats-image-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/class-webfinger-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/oauth/class-authorization-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/oauth/class-clients-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/oauth/class-token-controller.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/trait-collection.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/trait-event-stream.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/trait-language-map.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/rest/trait-verification.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/scheduler/class-actor.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/scheduler/class-collection-sync.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/scheduler/class-comment.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/scheduler/class-post.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/scheduler/class-statistics.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/signature/class-http-message-signature.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/signature/class-http-signature-draft.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/signature/interface-http-signature.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-activity-object.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-attachment.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-base.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-comment.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-factory.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-json.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-post.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-term.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/includes/transformer/class-user.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/README.md create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-akismet.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-buddypress.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-classic-editor.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-enable-mastodon-apps.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-jetpack.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-litespeed-cache.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-multisite-language-switcher.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-nodeinfo.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-opengraph.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-podlove-podcast-publisher.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-seriously-simple-podcasting.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-surge.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-webfinger.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-wp-rest-cache.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-wpml.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/class-yoast-seo.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/load.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/stream/class-connector.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/stream/class-stream.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/integration/surge-cache-config.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/patterns/author-header.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/patterns/author-profile.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/patterns/follow-page.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/patterns/following-page.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/patterns/profile-page.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/patterns/social-sidebar.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/patterns/stats-post.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/readme.txt create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/activitypub-json.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/admin-header.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/advanced-settings.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/block-confirmation.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/blocked-actors-list.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/blog-settings.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/bulk-actor-delete-confirmation.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/bulk-block-confirmation.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/emails/new-dm.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/emails/new-follower.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/emails/new-mention.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/emails/parts/footer.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/emails/parts/header.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/emails/stats-report.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/embed.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/followers-list.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/following-list.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/account-migration.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/core-features.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/editor-blocks.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/getting-started.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/glossary.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/resources.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/template-tags.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/troubleshooting.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/help-tab/users.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/oauth-authorize.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/oauth-error.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/post-preview.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/settings.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/tombstone-json.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/toolbox.php create mode 100644 wp-content/upgrade-temp-backup/plugins/activitypub/templates/welcome.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/.editorconfig create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/.gitignore create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/LICENSE create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/README.md create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/bitcoin.png create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AIBotTracking.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Sitebrowser.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Statistics.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AjaxTracker.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/File.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Settings.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/BrowserDetails.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/City.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.json create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.lock create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/config.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/css/index.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/css/wp-piwik.css create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/gpl-3.0.html create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/index.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/js/chartjs/LICENSE.md create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/js/chartjs/README.md create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/js/chartjs/chart.min.js create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/js/index.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/js/wp-piwik.js create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/.tx/config create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/update.sh create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-az_AZ.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-az_AZ.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-be_BY.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-be_BY.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-cs_CZ.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-cs_CZ.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_CH.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_CH.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_DE.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_DE.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el_GR.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el_GR.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-es_ES.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-es_ES.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fa_IR.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fa_IR.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fr_FR.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fr_FR.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hi.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hi.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hu_HU.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hu_HU.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-id.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-id.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-it_IT.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-it_IT.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-lb.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-lb.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-lt_LT.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-lt_LT.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-nb_NO.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-nb_NO.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-nl_NL.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-nl_NL.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-pl_PL.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-pl_PL.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-pt_BR.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-pt_BR.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-ro_RO.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-ro_RO.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-ru_RU.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-ru_RU.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-sl_SI.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-sl_SI.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-sq.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-sq.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-sv_SE.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-sv_SE.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-tr_TR.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-tr_TR.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-ua_UA.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-ua_UA.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-uk_UA.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-uk_UA.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-zh_CN.mo create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-zh_CN.po create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik.pot create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/.gitattributes create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/.gitignore create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/CHANGELOG.md create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/LICENSE create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/MatomoTracker.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/PiwikTracker.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/README.md create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/composer.json create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/libs/matomo-php-tracker/phpunit.xml.dist create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/misc/track_ai_bot.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/package-lock.json create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/package.json create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/proxy/config.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/proxy/index.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/proxy/matomo.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/proxy/piwik.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/proxy/proxy.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/readme.txt create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/screenshot-1.gif create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/screenshot-2.gif create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/screenshot-3.gif create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/screenshot-4.gif create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/uninstall.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/update/2015051101.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/update/2017080701.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/update/2021070701.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/update/2023052301.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/update/90001.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/update/90801.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/update/91006.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/wp-piwik.php create mode 100644 wp-content/upgrade-temp-backup/plugins/wp-piwik/wpml-config.xml diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/LICENSE b/wp-content/upgrade-temp-backup/plugins/activitypub/LICENSE new file mode 100644 index 00000000..644800f2 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2019 Matthias Pfefferle +Copyright (c) 2023 Automattic + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/activitypub.php b/wp-content/upgrade-temp-backup/plugins/activitypub/activitypub.php new file mode 100644 index 00000000..100f29ff --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/activitypub.php @@ -0,0 +1,182 @@ +register_routes(); + ( new Rest\Actors_Inbox_Controller() )->register_routes(); + ( new Rest\Admin\Actions_Controller() )->register_routes(); + ( new Rest\Admin\Statistics_Controller() )->register_routes(); + ( new Rest\Application_Controller() )->register_routes(); + ( new Rest\Stats_Image_Controller() )->register_routes(); + ( new Rest\Collections_Controller() )->register_routes(); + ( new Rest\Comments_Controller() )->register_routes(); + ( new Rest\Followers_Controller() )->register_routes(); + ( new Rest\Following_Controller() )->register_routes(); + ( new Rest\Liked_Controller() )->register_routes(); + ( new Rest\Inbox_Controller() )->register_routes(); + ( new Rest\Interaction_Controller() )->register_routes(); + ( new Rest\Moderators_Controller() )->register_routes(); + if ( \get_option( 'activitypub_api', false ) ) { + ( new Rest\OAuth\Authorization_Controller() )->register_routes(); + ( new Rest\OAuth\Clients_Controller() )->register_routes(); + ( new Rest\OAuth\Token_Controller() )->register_routes(); + } + ( new Rest\Outbox_Controller() )->register_routes(); + ( new Rest\Post_Controller() )->register_routes(); + ( new Rest\Replies_Controller() )->register_routes(); + ( new Rest\Webfinger_Controller() )->register_routes(); + + // Load NodeInfo endpoints only if blog is public. + if ( is_blog_public() ) { + ( new Rest\Nodeinfo_Controller() )->register_routes(); + } + ( new Rest\Proxy_Controller() )->register_routes(); +} +\add_action( 'rest_api_init', __NAMESPACE__ . '\rest_init' ); + +/** + * Initialize plugin. + */ +function plugin_init() { + \add_action( 'init', array( __NAMESPACE__ . '\Activitypub', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Avatars', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Cache', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Comment', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Dispatcher', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Embed', 'init' ) ); + if ( \get_option( 'activitypub_api', false ) ) { + \add_action( 'init', array( __NAMESPACE__ . '\Event_Stream', 'init' ) ); + } + \add_action( 'init', array( __NAMESPACE__ . '\Handler', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Hashtag', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Link', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Mailer', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Mention', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Migration', 'init' ), 1 ); + \add_action( 'init', array( __NAMESPACE__ . '\Move', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Options', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Post_Types', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Router', 'init' ) ); + // Priority 0 ensures Scheduler hooks are registered before Migration (priority 1) runs. + \add_action( 'init', array( __NAMESPACE__ . '\Scheduler', 'init' ), 0 ); + \add_action( 'init', array( __NAMESPACE__ . '\Search', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\Signature', 'init' ) ); + // Only load OAuth Server if the ActivityPub API is enabled. + if ( \get_option( 'activitypub_api', false ) ) { + \add_action( 'init', array( __NAMESPACE__ . '\OAuth\Server', 'init' ) ); + } + + if ( site_supports_blocks() ) { + \add_action( 'init', array( __NAMESPACE__ . '\Blocks', 'init' ) ); + } + + // Only load relay if relay mode is enabled. + if ( \get_option( 'activitypub_relay_mode', false ) ) { + \add_action( 'init', array( __NAMESPACE__ . '\Relay', 'init' ) ); + } + + // Load development tools. + if ( 'local' === wp_get_environment_type() ) { + $loader_file = __DIR__ . '/local/load.php'; + if ( \file_exists( $loader_file ) && \is_readable( $loader_file ) ) { + require_once $loader_file; + } + } +} +\add_action( 'plugins_loaded', __NAMESPACE__ . '\plugin_init' ); + +/** + * Initialize plugin admin. + */ +function plugin_admin_init() { + // Screen Options and Menus are set before `admin_init`. + \add_action( 'init', array( __NAMESPACE__ . '\WP_Admin\Heartbeat', 'init' ), 9 ); // Before script loader. + \add_filter( 'init', array( __NAMESPACE__ . '\WP_Admin\Screen_Options', 'init' ) ); + \add_action( 'init', array( __NAMESPACE__ . '\WP_Admin\Menu', 'init' ) ); + + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Admin', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Advanced_Settings_Fields', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\App', 'init' ), 0 ); // Before admin bar init. + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Blog_Settings_Fields', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Health_Check', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Settings', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Settings_Fields', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Dashboard', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\User_Settings_Fields', 'init' ) ); + \add_action( 'admin_init', array( __NAMESPACE__ . '\WP_Admin\Welcome_Fields', 'init' ) ); + + if ( defined( 'WP_LOAD_IMPORTERS' ) && WP_LOAD_IMPORTERS ) { + require_once __DIR__ . '/includes/wp-admin/import/load.php'; + \add_action( 'admin_init', __NAMESPACE__ . '\WP_Admin\Import\load' ); + } +} +\add_action( 'plugins_loaded', __NAMESPACE__ . '\plugin_admin_init' ); + +/** + * Redirect to the welcome page after plugin activation. + * + * @param string $plugin The plugin basename. + */ +function activation_redirect( $plugin ) { + if ( ACTIVITYPUB_PLUGIN_BASENAME === $plugin ) { + \wp_safe_redirect( \admin_url( 'options-general.php?page=activitypub' ) ); + exit; + } +} +\add_action( 'activated_plugin', __NAMESPACE__ . '\activation_redirect' ); + +// Check for CLI env, to add the CLI commands. +if ( defined( 'WP_CLI' ) && WP_CLI ) { + Cli::register(); +} + +// Register OAuth login form handler early (before wp-login.php processes). +\add_action( 'login_form_activitypub_authorize', array( __NAMESPACE__ . '\OAuth\Server', 'login_form_authorize' ) ); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin-bar.css b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin-bar.css new file mode 100644 index 00000000..689969bb --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin-bar.css @@ -0,0 +1,7 @@ +/* Admin Bar Social Web Icon */ +#wpadminbar .activitypub-admin-bar-social-web .ab-item::before { + content: "\2042"; /* ⁂ Asterism */ + font-family: Arial, Helvetica, sans-serif; + font-weight: 700; + top: 2px; +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin.css b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin.css new file mode 100644 index 00000000..225b95bb --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-admin.css @@ -0,0 +1,414 @@ +.activitypub-settings { + max-width: 800px; + margin: 0 auto; + position: relative; +} + +.settings_page_activitypub div:not(.wrap) > .notice { + max-width: 800px; + margin: 0 auto 30px; +} + +.settings_page_activitypub div:not(.wrap) > .update-nag { + margin: 25px 20px 15px 22px; +} + +.settings_page_activitypub .wrap { + padding-left: 22px; +} + +.activitypub-settings p.interactions { + margin-bottom: 1em; +} + +.activitypub-settings-header { + text-align: center; + margin: 0 0 1rem; + background: #fff; + border-bottom: 1px solid #dcdcde; +} + +.activitypub-settings-header h1 { + display: inline-block; + font-weight: 600; + margin: 0 0.8rem 1rem; + font-size: 23px; + padding: 9px 0 4px; + line-height: 1.3; +} + +.activitypub-settings-title-section { + display: flex; + align-items: center; + justify-content: center; + clear: both; + padding-top: 8px; +} + +.settings_page_activitypub #wpcontent { + padding-left: 0; +} + +.activitypub-settings-tabs-scroller { + overflow-x: auto; + width: 100%; + padding-top: 2px; + -webkit-overflow-scrolling: touch; + scroll-behavior: smooth; +} + +.activitypub-settings-tabs-wrapper { + display: inline-flex; + vertical-align: top; + flex-wrap: nowrap; + gap: 0; +} + +.activitypub-settings-tab.active { + box-shadow: inset 0 -3px #3582c4; + font-weight: 600; +} + +.activitypub-settings-tab { + display: block; + text-decoration: none; + color: inherit; + padding: 0.5rem 1rem 1rem; + margin: 0 1rem; + transition: box-shadow 0.5s ease-in-out; + white-space: nowrap; +} + +.activitypub-settings .row { + margin-bottom: 16px; +} + +.activitypub-settings .row > div { + max-width: calc(100% - 24px); + display: inline-flex; + flex-direction: column; +} + +.activitypub-settings .row .description { + margin-top: 0; +} + +.wp-header-end { + visibility: hidden; + margin: -2px 0 0; +} + +summary { + cursor: pointer; + text-decoration: underline; + color: #2271b1; +} + +.activitypub-site-block-details { + margin: 10px 0; +} + +.activitypub-site-block-details summary { + padding: 8px 0; + color: inherit; + text-decoration: none; +} + +.activitypub-site-block-details table { + max-width: 500px; + margin-top: 10px; +} + +.activitypub-site-block-details td:last-child { + width: 80px; +} + +.activitypub-settings-accordion { + border: 1px solid #c3c4c7; +} + +.activitypub-settings-accordion-heading { + margin: 0; + border-top: 1px solid #c3c4c7; + font-size: inherit; + line-height: inherit; + font-weight: 600; + color: inherit; +} + +.activitypub-settings-accordion-heading:first-child { + border-top: none; +} + +.activitypub-settings-accordion-panel { + margin: 0; + padding: 1em 1.5em; + background: #fff; +} + +.activitypub-settings-accordion-trigger { + background: #fff; + border: 0; + color: #2c3338; + cursor: pointer; + display: flex; + font-weight: 400; + margin: 0; + padding: 1em 3.5em 1em 1.5em; + min-height: 46px; + position: relative; + text-align: left; + width: 100%; + align-items: center; + justify-content: space-between; + -webkit-user-select: auto; + user-select: auto; +} + +.activitypub-settings-accordion-trigger .title { + pointer-events: none; + font-weight: 600; + flex-grow: 1; +} + +.activitypub-settings-accordion-trigger .icon, +.activitypub-settings-accordion-viewed .icon { + border: solid #50575e medium; + border-width: 0 2px 2px 0; + height: 0.5rem; + pointer-events: none; + position: absolute; + right: 1.5em; + top: 50%; + transform: translateY(-70%) rotate(45deg); + width: 0.5rem; +} + +.activitypub-settings-accordion-trigger[aria-expanded="true"] .icon { + transform: translateY(-30%) rotate(-135deg); +} + +table.followings .dashicons { + font-size: 1em; + line-height: 1.7; +} + +.activitypub-settings-accordion-trigger:active, +.activitypub-settings-accordion-trigger:hover { + background: #f6f7f7; +} + +.activitypub-settings-accordion-trigger:focus { + color: #1d2327; + border: none; + box-shadow: none; + outline-offset: -1px; + outline: 2px solid #2271b1; + background-color: #f6f7f7; +} + +.activitypub-settings +input.blog-user-identifier { + text-align: right; +} + +.activitypub-settings +.header-image { + width: 100%; + height: 80px; + position: relative; + display: block; + margin-bottom: 40px; + background-image: rgb(168, 165, 175); + background-image: linear-gradient(180deg, #f00, #ff0); + background-size: cover; +} + +.activitypub-settings .logo { + height: 80px; + width: 80px; + position: relative; + top: 40px; + left: 40px; +} + +.settings_page_activitypub .plugin-recommendations { + border-bottom: none; + margin-bottom: 0; +} + +/* stylelint-disable-next-line selector-id-pattern -- WordPress core ID */ +#dashboard_right_now li a.activitypub-followers::before { + content: "\f307"; + /* stylelint-disable-next-line font-family-no-missing-generic-family-keyword */ + font-family: dashicons; +} + +.activitypub-comment .dashboard-comment-wrap { + padding-inline-start: 63px; +} + +.activitypub-comment .dashboard-comment-wrap .comment-author { + margin-block: 0; +} + +.extra-fields-nav a + a { + margin-left: 8px; +} + +.rtl .extra-fields-nav a + a { + margin-left: auto; + margin-right: 8px; +} + +.contextual-help-tabs-wrap dt { + font-weight: 600; +} + +.contextual-help-tabs-wrap .activitypub-block-screenshot { + margin: 10px 0; +} + +.contextual-help-tabs-wrap .activitypub-block-screenshot img { + border: 1px solid #ddd; + border-radius: 4px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + height: auto; + max-width: 100%; +} + +.contextual-help-tabs-wrap .activitypub-block-screenshot figcaption { + color: #555; + font-style: italic; + font-size: 0.9em; + margin-top: 5px; +} + +/* Blockquote Styles */ +.contextual-help-tabs-wrap blockquote { + border-left: 4px solid #3582c4; + background-color: #f6f7f7; + padding: 16px 20px; + margin: 0 0 20px; +} + +.contextual-help-tabs-wrap blockquote p { + margin: 0 0 10px; + line-height: 1.5; +} + +.contextual-help-tabs-wrap blockquote p:last-child { + margin-bottom: 0; +} + +.contextual-help-tabs-wrap blockquote cite { + display: block; + font-weight: 600; + margin-top: 8px; + font-size: 0.9em; + color: #50575e; +} + +.contextual-help-tabs-wrap blockquote cite::before { + content: "—"; +} + +/* Plugin List Styles */ +.plugin-list { + display: flex; + flex-wrap: wrap; + gap: 16px; + align-items: stretch; +} + +.plugin-list .plugin-card { + flex: 1 1 300px; + display: flex; + flex-direction: column; + box-sizing: border-box; + border-radius: 4px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + margin: 0; +} + +.plugin-list .plugin-card .desc { + flex: 1 1 auto; +} + +.plugin-list .plugin-action-buttons li { + display: inline-block; + vertical-align: middle; + margin: 0 0 10px 0; +} + +.plugin-list .plugin-card .action-links { + position: static; + margin-left: 148px; + width: auto; +} + +.plugin-list .plugin-action-buttons { + float: none; + margin: 1em 0 0; + text-align: left; +} + +.plugin-list .plugin-action-buttons li .button { + margin-right: 20px; +} + +.plugin-list .plugin-card h3 { + margin-right: 24px; +} + +/* stylelint-disable no-descending-specificity */ +.plugin-list .plugin-card .name, +.plugin-list .plugin-card .desc, +.plugin-card .desc > p { + margin-right: 0; +} +/* stylelint-enable no-descending-specificity */ + +.plugin-list .plugin-card .desc p:first-of-type { + margin-top: 0; +} + +/* RTL Support for blockquotes */ +.rtl .contextual-help-tabs-wrap blockquote { + border-left: none; + border-right: 4px solid #3582c4; + padding: 16px 20px; +} + +#activitypub-follow-form .highlight { + animation: highlight-fade 3s ease-in-out; + border-color: #3582c4 !important; + box-shadow: 0 0 0 1px #3582c4; +} + +@keyframes highlight-fade { + + 0% { + background-color: #e7f3ff; + border-color: #3582c4; + box-shadow: 0 0 0 1px #3582c4; + } + + 100% { + background-color: #fff; + border-color: #8c8f94; + box-shadow: none; + } +} + +@media screen and (max-width: 782px) { + + .activitypub-settings { + margin: 0 22px; + } + + .activitypub-settings .row > div { + max-width: calc(100% - 36px); + width: 100%; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-embed.css b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-embed.css new file mode 100644 index 00000000..35332029 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-embed.css @@ -0,0 +1,157 @@ +/** + * ActivityPub embed styles. + */ + +.activitypub-embed { + background: #fff; + border: 1px solid #e6e6e6; + border-radius: 12px; + padding: 0; + max-width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; +} + +.activitypub-reply-block .activitypub-embed { + margin: 1em 0; +} + +.activitypub-embed-header { + padding: 15px; + display: flex; + align-items: center; + gap: 10px; +} + +.activitypub-embed-header img { + width: 48px; + height: 48px; + border-radius: 50%; +} + +.activitypub-embed-header-text { + flex-grow: 1; +} + +.activitypub-embed-header-text h2 { + color: #000; + font-size: 15px; + font-weight: 600; + margin: 0; + padding: 0; +} + +.activitypub-embed-header-text .ap-account { + color: #687684; + font-size: 14px; + text-decoration: none; +} + +.activitypub-embed-content { + padding: 0 15px 15px; +} + +.activitypub-embed-content .ap-title { + font-size: 23px; + font-weight: 600; + margin: 0 0 10px; + padding: 0; + color: #000; +} + +.activitypub-embed-content .ap-subtitle { + font-size: 15px; + color: #000; + margin: 0 0 15px; +} + +.activitypub-embed-content .ap-preview { + border: 1px solid #e6e6e6; + border-radius: 8px; + box-sizing: border-box; + display: grid; + gap: 2px; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + margin: 1em 0 0; + min-height: 64px; + overflow: hidden; + position: relative; + width: 100%; +} + +.activitypub-embed-content .ap-preview img { + border: 0; + box-sizing: border-box; + display: block; + height: 100%; + object-fit: cover; + overflow: hidden; + position: relative; + width: 100%; +} + +.activitypub-embed-content .ap-preview video, +.activitypub-embed-content .ap-preview audio { + max-width: 100%; + display: block; + grid-column: 1 / span 2; +} + +.activitypub-embed-content .ap-preview audio { + width: 100%; +} + +.activitypub-embed-content .ap-preview.layout-1 { + grid-template-columns: 1fr; + grid-template-rows: 1fr; +} + +.activitypub-embed-content .ap-preview.layout-2 { + aspect-ratio: auto; + grid-template-rows: 1fr; + height: auto; +} + +.activitypub-embed-content .ap-preview.layout-3 > img:first-child { + grid-row: span 2; +} + +.activitypub-embed-content .ap-preview-text { + padding: 15px; +} + +.activitypub-embed-meta { + padding: 15px; + border-top: 1px solid #e6e6e6; + color: #687684; + font-size: 13px; + display: flex; + gap: 15px; +} + +.activitypub-embed-meta .ap-stat { + display: flex; + align-items: center; + gap: 5px; +} + +@media only screen and (max-width: 399px) { + + .activitypub-embed-meta span.ap-stat { + display: none !important; + } +} + +.activitypub-embed-meta a.ap-stat { + color: inherit; + text-decoration: none; +} + +.activitypub-embed-meta strong { + font-weight: 600; + color: #000; +} + +.activitypub-embed-meta .ap-stat-label { + color: #687684; +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-post-preview.css b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-post-preview.css new file mode 100644 index 00000000..18fb71de --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-post-preview.css @@ -0,0 +1,201 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 1em; + line-height: 1.5; + margin: 0; + padding: 0; +} + +main { + flex: 1; + border: 1px solid #ccc; + border-radius: 4px; + background-color: #fff; + margin: 1em; + max-width: 600px; +} + +main p { + margin-bottom: 1em; +} + +hr { + background: transparent; + border: 0; + border-top: 1px solid #ccc; + flex: 0 0 auto; + margin: 10px 0; +} + +.columns { + display: flex; + flex-direction: row; + justify-content: space-between; + margin: 0 auto; + max-width: 1200px; +} + +.sidebar { + flex: 1; + padding: 1em; + max-width: 285px; +} + +.sidebar h1 { + font-size: 1.5em; + margin-bottom: 1em; + margin-top: 0; + padding: 5px 10px; + border-radius: 4px; + background-color: #6364ff; + color: #fff; + display: inline-block; +} + +.sidebar ul { + list-style-type: none; + padding: 0; +} + +.sidebar ul li { + padding: 5px; + color: #ccc; +} + +.sidebar input[type="search"], +.sidebar textarea { + background-color: #f6f6f6; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; + color: #333; + display: block; + font-size: 1em; + margin-bottom: 1em; + padding: 0.5em; + width: 100%; +} + +.sidebar > div, +main address { + align-items: center; + display: flex; + margin-bottom: 1em; + font-style: normal; +} + +.name { + color: #ccc; + font-weight: 700; + display: block; +} + +.webfinger { + color: #ccc; + font-size: 0.8em; + font-weight: 700; + display: block; + margin-top: 0.5em; +} + +main address .name, +main address .webfinger { + color: #000; +} + +address img, +.sidebar .fake-image { + border-radius: 8px; + margin-right: 1em; + width: 48px; + height: 48px; + background-color: #333; +} + +main article { + padding: 1em; +} + +main .content { + margin: 1em 0; + font-size: 1.2em; +} + +main .content h2 { + font-size: 1.2em; +} + +main .attachments { + border-radius: 8px; + box-sizing: border-box; + display: grid; + gap: 2px; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + margin: 1em 0; + min-height: 64px; + overflow: hidden; + position: relative; + width: 100%; +} + +main .attachments.layout-1 { + grid-template-columns: 1fr; + grid-template-rows: 1fr; +} + +main .attachments.layout-2 { + aspect-ratio: auto; + grid-template-rows: 1fr; + height: auto; +} + +main .attachments img { + border: 0; + box-sizing: border-box; + display: inline-block; + height: 100%; + object-fit: cover; + overflow: hidden; + position: relative; + width: 100%; +} + +main .attachments.layout-3 > img:first-child { + grid-row: span 2; +} + +main .attachments video, +main .attachments audio { + max-width: 100%; + margin: 1em 0; + display: block; + grid-column: 1 / span 2; +} + +main .attachments audio { + width: 100%; +} + +main .tags a { + background-color: #f6f6f6; + border-radius: 4px; + color: #333; + display: inline-block; + margin-right: 0.5em; + padding: 0.5em; + text-decoration: none; +} + +main .tags a:hover { + background-color: #e6e6e6; + text-decoration: underline; +} + +main .column-header { + font-size: 1.5em; + margin: 0; + padding: 5px 10px; + border-bottom: 1px solid #ccc; + vertical-align: middle; +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-welcome.css b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-welcome.css new file mode 100644 index 00000000..3a5ff2e1 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/css/activitypub-welcome.css @@ -0,0 +1,310 @@ +/* ActivityPub Welcome Page Styles */ + +.activitypub-welcome-container { + max-width: 800px; + margin: 40px auto; + background-color: #fff; + border-radius: 8px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + padding: 30px; +} + +/* Header Styles */ +.activitypub-welcome-header { + text-align: center; + margin-bottom: 30px; + position: relative; +} + +/* Progress Circle */ +.activitypub-progress-circle { + position: relative; + width: 120px; + height: 120px; + margin: 0 auto 20px; +} + +.activitypub-progress-circle-content { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + font-weight: 500; + color: #1e1e1e; + z-index: 2; +} + +.activitypub-progress-ring { + transform: rotate(-90deg); + overflow: visible; +} + +.activitypub-progress-ring-bg { + fill: none; + stroke: #f0f0f1; + stroke-width: 6; +} + +.activitypub-progress-ring-circle { + fill: none; + stroke: #2271b1; + stroke-width: 6; + stroke-linecap: round; + transition: stroke-dashoffset 0.5s ease; +} + +.activitypub-welcome-title { + font-size: 28px; + margin: 20px 0 10px; + font-weight: 400; +} + +.activitypub-welcome-subtitle { + font-size: 16px; + color: #646970; + margin: 0 0 20px; + font-weight: 400; +} + +/* Steps Styles */ +.activitypub-onboarding-step { + display: flex; + align-items: center; + padding: 20px; + border-radius: 4px; + background-color: #f6f7f7; + margin-bottom: 15px; + transition: background-color 0.2s ease; +} + +.activitypub-onboarding-step:last-child { + margin-bottom: 0; +} + +.activitypub-onboarding-step:hover { + background-color: #f0f0f1; +} + +.step-indicator { + margin-right: 15px; + flex-shrink: 0; +} + +.step-icon { + width: 24px; + height: 24px; + font-size: 24px; + display: flex; + align-items: center; + justify-content: center; +} + +.dashicons-warning { + color: #dba617; +} + +.step-content { + flex-grow: 1; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; +} + +.step-text { + flex-grow: 1; +} + +.step-text h3 { + margin: 0 0 5px; + font-size: 16px; + font-weight: 500; +} + +.step-text p { + margin: 0; + color: #646970; + font-size: 14px; +} + +.step-action { + flex-shrink: 0; + margin-left: 20px; +} + +.activitypub-step-completed { + background-color: #f0f7ee; +} + +.activitypub-step-completed:hover { + background-color: #e2f1dc; +} + +.activitypub-step-completed .step-text h3 { + margin: 0; +} + +.activitypub-step-completed .step-text h3::after { + content: "."; +} + +.activitypub-step-completed .step-text p, +.activitypub-step-completed .step-action { + display: none; +} + +.activitypub-step-completed .step-icon { + color: #008a20; +} + +.step-action .button { + min-width: 120px; + text-align: center; +} + +/* Profiles Section */ +.activitypub-profiles-section { + margin-top: 40px; + border-top: 1px solid #f0f0f1; + padding-top: 30px; +} + +.profiles-description { + margin-bottom: 20px; + font-size: 16px; + color: #1e1e1e; +} + +.activitypub-profiles-container { + display: flex; + flex-wrap: wrap; + gap: 20px; + margin-bottom: 30px; +} + +.activitypub-profile-card { + flex: 1; + min-width: 300px; + background-color: #fff; + border: 1px solid #c3c4c7; + border-radius: 4px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.profile-card-header { + background-color: #f0f0f1; + padding: 15px; + border-bottom: 1px solid #c3c4c7; + display: flex; + align-items: center; +} + +.profile-icon { + margin-right: 10px; +} + +.profile-icon .dashicons { + font-size: 20px; + width: 20px; + height: 20px; +} + +/* stylelint-disable-next-line no-descending-specificity */ +.profile-card-header h3 { + margin: 0; + font-size: 16px; + font-weight: 500; +} + +.profile-card-content { + padding: 15px; +} + +.extra-field { + margin-bottom: 15px; +} + +.extra-field label { + display: block; + margin-bottom: 5px; + font-weight: 500; + font-size: 13px; + color: #646970; +} + +.extra-field input { + width: 100%; + padding: 8px; + font-size: 13px; + background-color: #f6f7f7; + border: 1px solid #dcdcde; + border-radius: 3px; +} + +.profile-description { + font-size: 13px; + color: #646970; + margin: 15px 0; + line-height: 1.5; +} + +.profile-card-content .button { + width: 100%; + text-align: center; + margin-top: 10px; +} + +/* Footer Styles */ +.activitypub-welcome-footer { + margin-top: 30px; + text-align: center; +} + +.skip-steps-link { + color: #2271b1; + text-decoration: none; + font-size: 14px; +} + +.skip-steps-link:hover { + color: #135e96; + text-decoration: underline; +} + +/* Responsive Adjustments */ +@media screen and (max-width: 782px) { + + .activitypub-welcome-container { + margin: 20px; + padding: 20px; + } + + .step-content { + flex-direction: column; + align-items: flex-start; + } + + .step-action { + margin-left: 0; + margin-top: 15px; + width: 100%; + } + + .step-action .button { + width: 100%; + text-align: center; + } + + .activitypub-profiles-container { + flex-direction: column; + } + + .activitypub-profile-card { + width: 100%; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/follow-me.png b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/follow-me.png new file mode 100644 index 0000000000000000000000000000000000000000..a81ec882b62e2945898167bb6dbcd5207cdbe373 GIT binary patch literal 21868 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 literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/followers.png b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/followers.png new file mode 100644 index 0000000000000000000000000000000000000000..c34738fd53156eb53fca1055db9f5cfd25f872db GIT binary patch literal 27519 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 literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/mp.jpg b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/mp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f45581755e90ede6cf3afd8aebffc22eeb89befc GIT binary patch literal 2741 zcmb7Fc{r478-L$f%wU)qGg>TTP__ug$UcNbVkXWvg}$*Ag)9w8ow8LTDZ5mtWQpvK z%LQcz^chGXK@A}SnefKE?oPU?k*zgdhwSF6a@6OL8#zFIs~TCs|M-z(Zsgq-yT}$crn|@ilx>R2 zWM6+L&m*jpWPP%>ngF*S*a^U4Fy4X!0WBmNi9{ff0w@$88Y6(g2nq-a3JHtggoN?J zf`YhpI6Q$UDk_S>uHUeZxIu&{O5_~^!l51nk{^lWCkhD)5&!St)&h7m2!H?_lmTFP z5RM1A^?*1;z~IoQ{s<%=9DxF1P?GpJex-uj2Vme(3l5G00Ps!lkGB6rV4+938tFT~ z&ROP(=41@nz@T2!@1u6?3%j+H_}GKARw@7>1M0P7_o}V34ml4tHS(a$5lPk5v{jO# zqpCBJ&coVEMt_W7Sz)n3)|yoWGKAqRUIDjPIDmh{NT*%%253VzcVDdoK#$yGl1NDz z0BF-t(hXv+R${8xJ8wPF27S#Kad!M;mE@+5m4uf6yT^OjJc!Z0VAwIiBH$p52w~pf zaS$R-jPFLzLVf<(ANE20ya2Hllh-HM000XbLhV?gAe`YHrU-GWpL&Xe*SPk<`r|&l z0c^qnAWs(nd@TbYKo}gUMg{O91R_}-C+!2>IU1S-h=hGT81}S^#9Njsjw@raumxS=@?hX{wJu%@}31tV?WMm}?yn zwRF7}D{nlFH}$oa2*5Ol3)eDi?u#xph&JpdTAfSEyjY@^;h>!45`8GJuGGDdU-C}F zCJ(|}dc#zVK(?x9K#f#m8gAtC$r<|al$1yg%6*X;Q{`$Ehu_D#X^@gfm*r424;pM| z+}R${^CG}cjBPb4r=CByIU?>-U`Lk17ek(c@jok@cf-Lew+SiU5CqQtLj~-6g(@^5 zkdOEJzKsZk0dTyu8dXHbh^D@c?nE&5^$Q`(Iv3%5V%LVnX9)XR5LcFVKDCSsq&A`D zv&+v`*eee?pO&@_V;6}ts->>nUm9?p{%Tx3gR`&l1aInh3`ICbWch3%t_>=XC;5~TByOQ1q_tP*+)4j;8iY; z`+H^T?Va1=B`#1e6i=w5_t+R59bqiHZ#jRy4n2~?jE@lDDB*>|XWP2b)*>~sWAB{l zXM~^G+?OecxPRzO-e;3}`2`#JQ#mhliM!4>RsN;xaNri}N^~>z0K2%o=vL;3C{{r> zO=*fU;wTrD(MNf=%e~#a$3FX*K^imx1stSp7=rJI4S{$-T1}m5L~{zcnlbBJLoRB^ zeSZap(p(@3QRr9zyIgEHmt!G93M$VkBdRs0x|HoikHsu%pg;|o3&k^Z%Z?$M`g6kD zU>wfp^L)CNskR|8(j>g!LUC@_JB-(Fvd1r9rTr-efXw=&a2Dx+F8hH#r6DBx(O|^p zFded=GHn19l3BjfHorsfbwlM1tWs)=UQ}{hCVz^VnTfhlLg>N{Z}+SG4|>a$=>c3I zNE^0vxTOA3iCfA*2QqZryBQqy zaqn!I=$FQh1j}h#W&N;ER5W@AGhKSqa95sw-Le(^l#X(W#H+}u;1b^;GUn;?xTdDI zLx>Mgqf7oE1++%C2);>vGFB>@EajW=3|nz~PE5jn^RdqIXxIEft@>R#Gn$DpIx)09 zpJCbprK2%y$~!#Wr^*ILWoV?=$hv0kJlDy`dJ5+(bUsd@e!iKkXLE3{B`p%(-&3;` z>7BI{sT$Vg`aWyCIPmk?Z`Qx!R6H;I?}7f2vX&?bTiX#@_2!?hrCcD~s<4{a$HQx8 z$*XByJKPAuEo;3nQ@#1~Kb_OMcFsJnUXPamHCFL(Ftp*3(1P3tW_TTV7Jbj)y z;QpsMtX3%U#0#Pz1ON743F4)JZ{n@-%_y2Bx4-{My*Nm{(y(MuCFY9yz4y#Jj&-BY z;u)b5y)%7^oz;_vf#lX=z5I%@C$n52usrWnZ~LD0+c|+zn~~i}`1v#mP7On;$L3zT z|CduUE;2BHDs>ISnML%lQC+zAZpslfH0Ln?eyvAOe!V}8_QOtVz8;eE@YrE9GBx6& zfB=IXUwc_?(5;ekZHi=P`=&1k4PI)p8?NblfQiLfFjWK!(Zf+4Q`Fx?#GS7X(JozD zK6fhathk41vwB9=rgb_thH^xL&fny}yQ^bOTL zXq)k}FY*ufhF*OhY^7r$R}13BE}o?9$7uYC+H=QM;WjEIb8utcw3q(BUGCa7%TQ}6 zz|LDf(~3bLxF_hTdDbEi0Wu@B>39*jGx-?J$4^4H6TT9YsoHPgDZv}Un8 zXtH}-1q!F8&yCd#&-0v2?7Y->TnTlY*HBA&^hyQUzD>1wf>dAc9YRFr|jjx z!bZX09lIA?!~3?rcGte7DTUn#%>5#5{c3_?h{}C&!hZHM>7Gfi@=Xi2;-_fKDTj%E z|KY;BGKD*{EAe|onMp<}mN&$wuWMzPbeOWLU-!!i%EfNU?+@+zt$ zOaIomoOQQ^WN%=K6vJoHp%H0*0w6830NW&2*>`@Kc=?Hi=8lUOJ_I>%0WA3t7s!e= Il;ZaO1r%BF*Z=?k literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/reactions.png b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/reactions.png new file mode 100644 index 0000000000000000000000000000000000000000..91bdbde3c3ea249c21ced4d360ee9da7e7109a0e GIT binary patch literal 63099 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 literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/reply.png b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/reply.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6a5523ee26c6857ecf7a24214a96ecc61d99ae GIT binary patch literal 47774 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 yc2%C$E(`kn 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 VBOQNo!tSn6MM+b!Lf#_ee*n9IbMXKG literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/wp-logo.png b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/img/wp-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..309e6311d952642239c5974f368047d782663814 GIT binary patch literal 8269 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 E105E*H2?qr literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-admin.js b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-admin.js new file mode 100644 index 00000000..764449b2 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-admin.js @@ -0,0 +1,20 @@ +jQuery( function( $ ) { + // Accordion handling in various areas. + $( '.activitypub-settings-accordion' ).on( 'click', '.activitypub-settings-accordion-trigger', function() { + var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) ); + + if ( isExpanded ) { + $( this ).attr( 'aria-expanded', 'false' ); + $( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', true ); + } else { + $( this ).attr( 'aria-expanded', 'true' ); + $( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false ); + } + } ); + + $(document).on( 'wp-plugin-install-success', function( event, response ) { + setTimeout( function() { + $( '.activate-now' ).removeClass( 'thickbox open-plugin-details-modal' ); + }, 1200 ); + } ); +} ); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-connected-apps.js b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-connected-apps.js new file mode 100644 index 00000000..84062db6 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-connected-apps.js @@ -0,0 +1,364 @@ +/** + * ActivityPub Connected Applications JavaScript. + * + * Handles registering OAuth clients, deleting clients, and revoking + * OAuth tokens from the user profile, following the WordPress core + * Application Passwords UI pattern. + */ + +/* global activitypubConnectedApps, jQuery, ClipboardJS */ + +( function( $ ) { + var $section = $( '#activitypub-connected-apps-section' ), + $newAppForm = $section.find( '.create-application-password' ), + $newAppFields = $newAppForm.find( '.input' ), + $newAppButton = $newAppForm.find( '.button' ), + $appsWrapper = $section.find( '#activitypub-registered-apps-wrapper' ), + $appsTbody = $section.find( '#activitypub-registered-apps-tbody' ), + $tokensWrapper = $section.find( '.activitypub-connected-apps-list-table-wrapper' ), + $tokensTbody = $section.find( '#activitypub-connected-apps-tbody' ), + $revokeAll = $section.find( '#activitypub-revoke-all-tokens' ), + $deleteAll = $section.find( '#activitypub-delete-all-clients' ); + + // Register a new application. + $newAppButton.on( 'click', function( e ) { + e.preventDefault(); + + if ( $newAppButton.prop( 'aria-disabled' ) ) { + return; + } + + var $name = $( '#activitypub-new-app-name' ); + var $redirectUri = $( '#activitypub-new-app-redirect-uri' ); + + if ( 0 === $name.val().trim().length ) { + $name.trigger( 'focus' ); + return; + } + + if ( 0 === $redirectUri.val().trim().length ) { + $redirectUri.trigger( 'focus' ); + return; + } + + clearNotices(); + $newAppButton.prop( 'aria-disabled', true ).addClass( 'disabled' ); + + $.ajax( { + url: activitypubConnectedApps.ajaxUrl, + method: 'POST', + data: { + action: 'activitypub_register_oauth_client', + name: $name.val().trim(), + redirect_uri: $redirectUri.val().trim(), + _wpnonce: activitypubConnectedApps.nonce + } + } ).always( function() { + $newAppButton.removeProp( 'aria-disabled' ).removeClass( 'disabled' ); + } ).done( function( response ) { + if ( ! response.success ) { + addNotice( + response.data && response.data.message ? response.data.message : activitypubConnectedApps.registerError, + 'error' + ); + return; + } + + // Build credential notice (matches core's tmpl-new-application-password). + var $notice = $( '
' ) + .attr( 'role', 'alert' ) + .attr( 'tabindex', '-1' ) + .addClass( 'notice notice-success is-dismissible new-application-password-notice' ); + + // Client ID row. + var $clientIdRow = $( '

' ).addClass( 'application-password-display' ) + .append( $( '' ).text( activitypubConnectedApps.clientIdLabel ) ) + .append( $( '' ).attr( { type: 'text', readonly: 'readonly' } ).addClass( 'code' ).val( response.data.client_id ) ) + .append( + $( '' ) + .attr( 'type', 'button' ) + .addClass( 'notice-dismiss' ) + .append( $( '' ).addClass( 'screen-reader-text' ).text( activitypubConnectedApps.dismiss ) ) + ); + + $newAppForm.after( $notice ); + + return $notice; + } + + /** + * Clears notice messages from the Connected Applications section. + */ + function clearNotices() { + $( '.notice', $section ).remove(); + } +}( jQuery ) ); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-following.js b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-following.js new file mode 100644 index 00000000..a0218b57 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-following.js @@ -0,0 +1,129 @@ +/** + * ActivityPub Following List Table Polling. + * + * Adds polling functionality to the Following list table to check for status updates + * of pending follow requests without requiring manual page refresh. + * + * @package Activitypub + */ + +( function ( $ ) { + 'use strict'; + + /** + * Following List Table Polling. + */ + var ActivityPubFollowing = { + /** + * Initialize the polling functionality. + */ + init: function () { + this.setupHeartbeatListeners(); + + // Check every 5 seconds. It'll automatically slow down after 2 mins 30 secs. + window.wp.heartbeat.interval( 'fast' ); + }, + + /** + * Set up WordPress Heartbeat API listeners. + */ + setupHeartbeatListeners: function () { + // Add our data to the Heartbeat API request. + $( document ).on( 'heartbeat-send.activitypub_following', function ( e, data ) { + data.activitypub_following_check = { + user_id: ActivityPubFollowingSettings.user_id, + pending_ids: ActivityPubFollowing.getPendingIds(), + }; + } ); + + // Process the Heartbeat API response. + $( document ).on( 'heartbeat-tick.activitypub_following', function ( e, data ) { + if ( data.activitypub_following ) { + ActivityPubFollowing.processUpdates( data.activitypub_following ); + } + } ); + }, + + /** + * Get IDs of all pending follow requests currently displayed in the table. + * + * @return {Array} Array of pending follow request IDs. + */ + getPendingIds: function () { + var pendingIds = []; + + // Find all rows with pending status. + $( '.wp-list-table tr.status-pending' ).each( function () { + var id = $( this ).attr( 'id' ); + + if ( id ) { + // Extract the numeric ID from the row ID (e.g., "following-123" -> "123"). + pendingIds.push( id.replace( /^following-(\d+)$/, '$1' ) ); + } + } ); + + return pendingIds; + }, + + /** + * Process updates received from the server. + * + * @param {Object} response Response data from the server. + */ + processUpdates: function ( response ) { + if ( response.counts ) { + // Update the counts in the views navigation. + if ( Object.hasOwn( response.counts, 'all' ) ) { + $( '.subsubsub .all .count' ).text( '(' + response.counts.all + ')' ); + } + if ( Object.hasOwn( response.counts, 'accepted' ) ) { + $( '.subsubsub .accepted .count' ).text( '(' + response.counts.accepted + ')' ); + } + if ( Object.hasOwn( response.counts, 'pending' ) ) { + $( '.subsubsub .pending .count' ).text( '(' + response.counts.pending + ')' ); + + // Remove heartbeat listeners when there are no more pending follows. + if ( 0 === response.counts.pending ) { + $( document ).off( 'heartbeat-send.activitypub_following' ); + $( document ).off( 'heartbeat-tick.activitypub_following' ); + window.wp.heartbeat.interval( 60 ); + } + } + } + + if ( ! response.updated_items || ! response.updated_items.length ) { + return; + } + + // Remove any existing notices. + $( 'div.notice' ).remove(); + + var $listTable = $( '#the-list' ); + + // Process each updated item. + $.each( response.updated_items, function ( index, item ) { + var $row = $( '#following-' + item.id ); + + if ( $row.length && item.status === 'accepted' ) { + // Remove the row when we're in the "Pending" view. + if ( 'pending' === new URLSearchParams( window.location.search ).get( 'status' ) ) { + $row.remove(); + } else { + $row.find( 'strong.pending' ).remove(); + } + + if ( 0 === $listTable.children().length ) { + $listTable.append( + '' + response.no_items + '' + ); + } + } + } ); + }, + }; + + // Initialize on document ready. + $( document ).ready( function () { + ActivityPubFollowing.init(); + } ); +} )( jQuery ); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-header-image.js b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-header-image.js new file mode 100644 index 00000000..d43af9e9 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-header-image.js @@ -0,0 +1,271 @@ +/** + * Handle the header image setting in + * + * This is based on site-icon.js + * + * @see wp-admin/js/site-icon.js + */ + +/* global jQuery, wp */ + +( function ( $ ) { + var $chooseButton = $( '#activitypub-choose-from-library-button' ), + $headerImagePreviewWrapper = $( '#activitypub-header-image-preview-wrapper' ), + $headerImagePreview = $( '#activitypub-header-image-preview' ), + $hiddenDataField = $( '#activitypub_header_image' ), + $removeButton = $( '#activitypub-remove-header-image' ), + frame, + ImageCropperNoCustomizer; + + /** + * We register our own handler because the Core one invokes the Customizer, which fails the request unnecessarily + * for users who don't have the 'customize' capability. + * See https://github.com/Automattic/wordpress-activitypub/issues/846 + */ + ImageCropperNoCustomizer = wp.media.controller.CustomizeImageCropper.extend( { + doCrop: function( attachment ) { + var cropDetails = attachment.get( 'cropDetails' ), + control = this.get( 'control' ), + ratio = cropDetails.width / cropDetails.height; + + // Use crop measurements when flexible in both directions. + if ( control.params.flex_width && control.params.flex_height ) { + cropDetails.dst_width = cropDetails.width; + cropDetails.dst_height = cropDetails.height; + + // Constrain flexible side based on image ratio and size of the fixed side. + } else { + cropDetails.dst_width = control.params.flex_width ? control.params.height * ratio : control.params.width; + cropDetails.dst_height = control.params.flex_height ? control.params.width / ratio : control.params.height; + } + + return wp.ajax.post( 'crop-image', { + // where wp_customize: 'on' would be in Core, for no good reason I understand. + nonce: attachment.get( 'nonces' ).edit, + id: attachment.get( 'id' ), + context: control.id, + cropDetails: cropDetails + } ); + } + } ); + + + + /** + * Calculate image selection options based on the attachment dimensions. + * + * @since 6.5.0 + * + * @param {Object} attachment The attachment object representing the image. + * @return {Object} The image selection options. + */ + function calculateImageSelectOptions( attachment ) { + var realWidth = attachment.get( 'width' ), + realHeight = attachment.get( 'height' ), + xInit = 1500, + yInit = 500, + ratio = xInit / yInit, + xImg = xInit, + yImg = yInit, + x1, + y1, + imgSelectOptions; + + if ( realWidth / realHeight > ratio ) { + yInit = realHeight; + xInit = yInit * ratio; + } else { + xInit = realWidth; + yInit = xInit / ratio; + } + + x1 = ( realWidth - xInit ) / 2; + y1 = ( realHeight - yInit ) / 2; + + imgSelectOptions = { + aspectRatio: xInit + ':' + yInit, + handles: true, + keys: true, + instance: true, + persistent: true, + imageWidth: realWidth, + imageHeight: realHeight, + minWidth: xImg > xInit ? xInit : xImg, + minHeight: yImg > yInit ? yInit : yImg, + x1: x1, + y1: y1, + x2: xInit + x1, + y2: yInit + y1, + }; + + return imgSelectOptions; + } + + /** + * Initializes the media frame for selecting or cropping an image. + * + * @since 6.5.0 + */ + $chooseButton.on( 'click', function () { + var $el = $( this ); + var userId = $el.data( 'userId' ); + var mediaQuery = { type: 'image' }; + if ( userId ) { + mediaQuery.author = userId; + } + + // Create the media frame. + frame = wp.media( { + button: { + // Set the text of the button. + text: $el.data( 'update' ), + + // Don't close, we might need to crop. + close: false, + }, + states: [ + new wp.media.controller.Library( { + title: $el.data( 'choose-text' ), + library: wp.media.query( mediaQuery ), + date: false, + suggestedWidth: $el.data( 'width' ), + suggestedHeight: $el.data( 'height' ), + } ), + new ImageCropperNoCustomizer( { + control: { + id: 'activitypub-header-image', + params: { + width: $el.data( 'width' ), + height: $el.data( 'height' ), + }, + }, + imgSelectOptions: calculateImageSelectOptions, + } ), + ], + } ); + + frame.on( 'cropped', function ( attachment ) { + $hiddenDataField.val( attachment.id ); + switchToUpdate( attachment ); + frame.close(); + + // Start over with a frame that is so fresh and so clean clean. + frame = null; + } ); + + // When an image is selected, run a callback. + frame.on( 'select', function () { + // Grab the selected attachment. + var attachment = frame.state().get( 'selection' ).first(), + targetRatio = $el.data( 'width' ) / $el.data( 'height' ), + currentRatio = attachment.attributes.width / attachment.attributes.height, + alreadyCropped = false; + + // Check if the image already has the correct aspect ratio (with a small tolerance). + if ( Math.abs( currentRatio - targetRatio ) < 0.01 ) { + // Check if this is the same image that was already selected. + if ( attachment.id !== parseInt( $hiddenDataField.val(), 10 ) ) { + // This is a new image with the correct aspect ratio. + $hiddenDataField.val( attachment.id ); + } + + alreadyCropped = true; + } + + if ( alreadyCropped ) { + // Skip cropping for already cropped images. + switchToUpdate( attachment.attributes ); + frame.close(); + } else { + frame.setState( 'cropper' ); + } + } ); + + frame.open(); + } ); + + /** + * Update the UI when a header is selected. + * + * @since 6.5.0 + * + * @param {array} attributes The attributes for the attachment. + */ + function switchToUpdate( attributes ) { + var i18nAppAlternativeString, i18nBrowserAlternativeString; + + if ( attributes.alt ) { + i18nBrowserAlternativeString = wp.i18n.sprintf( + /* translators: %s: The selected image alt text. */ + wp.i18n.__( 'Header Image preview: Current image: %s' ), + attributes.alt + ); + } else { + i18nAppAlternativeString = wp.i18n.sprintf( + /* translators: %s: The selected image filename. */ + wp.i18n.__( + 'Header Image preview: The current image has no alternative text. The file name is: %s' + ), + attributes.filename + ); + i18nBrowserAlternativeString = wp.i18n.sprintf( + /* translators: %s: The selected image filename. */ + wp.i18n.__( + 'Header Image preview: The current image has no alternative text. The file name is: %s' + ), + attributes.filename + ); + } + + // Set activitypub-header-image-preview src. + $headerImagePreview.attr( { + src: attributes.url, + alt: i18nAppAlternativeString, + } ); + + // Remove hidden class from header image preview div and remove button. + $headerImagePreviewWrapper.removeClass( 'hidden' ); + $removeButton.removeClass( 'hidden' ); + + // If the choose button is not in the update state, swap the classes. + if ( $chooseButton.attr( 'data-state' ) !== '1' ) { + $chooseButton.attr( { + class: $chooseButton.attr( 'data-alt-classes' ), + 'data-alt-classes': $chooseButton.attr( 'class' ), + 'data-state': '1', + } ); + } + + // Swap the text of the choose button. + $chooseButton.text( $chooseButton.attr( 'data-update-text' ) ); + } + + /** + * Handles the click event of the remove button. + * + * @since 6.5.0 + */ + $removeButton.on( 'click', function () { + $hiddenDataField.val( 'false' ); + $( this ).toggleClass( 'hidden' ); + $headerImagePreviewWrapper.toggleClass( 'hidden' ); + $headerImagePreview.attr( { + src: '', + alt: '', + } ); + + /** + * Resets state to the button, for correct visual style and state. + * Updates the text of the button. + * Sets focus state to the button. + */ + $chooseButton + .attr( { + class: $chooseButton.attr( 'data-alt-classes' ), + 'data-alt-classes': $chooseButton.attr( 'class' ), + 'data-state': '', + } ) + .text( $chooseButton.attr( 'data-choose-text' ) ) + .trigger( 'focus' ); + } ); +} )( jQuery ); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-moderation-admin.js b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-moderation-admin.js new file mode 100644 index 00000000..204253db --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/assets/js/activitypub-moderation-admin.js @@ -0,0 +1,440 @@ +/** + * ActivityPub Moderation Admin JavaScript + */ + +/* global activitypubModerationL10n, jQuery */ + +/** + * @param {Object} $ - jQuery + * @param {Object} wp - WordPress global object + * @param {Object} wp.i18n - Internationalization functions + * @param {Object} wp.a11y - Accessibility functions + * @param {Object} wp.ajax - AJAX functions + */ +(function( $, wp ) { + 'use strict'; + + var __ = wp.i18n.__; + var _n = wp.i18n._n; + var sprintf = wp.i18n.sprintf; + + /** + * Helper function to show a message using wp.a11y and alert + * + * @param {string} message - The message to display + */ + function showMessage( message ) { + if ( wp.a11y && wp.a11y.speak ) { + wp.a11y.speak( message, 'assertive' ); + } + alert( message ); + } + + /** + * Helper function to validate domain format + * + * @param {string} domain - The domain to validate + * @return {boolean} Whether the domain is valid + */ + function isValidDomain( domain ) { + // Basic domain validation - must contain at least one dot and valid characters + var domainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; + return domainRegex.test( domain ) && domain.includes( '.' ) && domain.length > 3; + } + + /** + * Helper function to check if a term already exists in the UI + * + * @param {string} type - The type of block (domain or keyword) + * @param {string} value - The value to check + * @param {string} context - The context (user or site) + * @param {number|null} userId - The user ID (for user context) + * @return {boolean} Whether the term is already blocked + */ + function isTermAlreadyBlocked( type, value, context, userId ) { + var selector; + if ( context === 'user' ) { + selector = '.activitypub-user-block-list[data-user-id="' + userId + '"] .remove-user-block-btn[data-type="' + type + '"][data-value="' + value + '"]'; + } else if ( context === 'site' ) { + selector = '.remove-site-block-btn[data-type="' + type + '"][data-value="' + value + '"]'; + } + return $( selector ).length > 0; + } + + /** + * Validate a blocked term value + * + * @param {string} type - The type of block (domain or keyword) + * @param {string} value - The value to validate + * @param {string} context - The context (user or site) + * @param {number|null} userId - The user ID (for user context) + * @return {boolean} Whether the value is valid + */ + function validateBlockedTerm( type, value, context, userId ) { + if ( ! value ) { + showMessage( __( 'Please enter a value to block.', 'activitypub' ) ); + return false; + } + + if ( type === 'domain' && ! isValidDomain( value ) ) { + showMessage( __( 'Please enter a valid domain (e.g., example.com).', 'activitypub' ) ); + return false; + } + + if ( isTermAlreadyBlocked( type, value, context, userId ) ) { + showMessage( __( 'This term is already blocked.', 'activitypub' ) ); + return false; + } + + return true; + } + + /** + * Create a table row for a blocked term. + * + * @param {string} type - The type of block (domain or keyword) + * @param {string} value - The blocked value + * @param {string} context - The context (user or site) + * @return {jQuery} The constructed table row + */ + function createBlockedTermRow( type, value, context ) { + var $button = $( '
+ + +
+

+
+ + +
+
+ + + +
+
+
+ +
+ +> +
+ +
+ + +
+ <?php echo esc_attr( $actor->get_name() ); ?> + +
+
+
get_name() ); ?>
+ +
+
+ + + + get_summary() ) : ?> +
+ get_summary() ); ?> +
+ + +
+ +
+ ' . esc_html( number_format_i18n( $stats['posts'] ) ) . '' + ); + ?> +
+ + +
+ ' . esc_html( number_format_i18n( $stats['followers'] ) ) . '' + ); + ?> +
+ +
+
+
+
+ + $block_id . '-modal', + 'content' => $modal_content, + /* translators: %s: Profile name. */ + 'title' => sprintf( esc_html__( 'Follow %s', 'activitypub' ), esc_html( $actor->get_name() ) ), + ) + ); + ?> +
diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index-rtl.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index-rtl.css new file mode 100644 index 00000000..7837bb7b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index-rtl.css @@ -0,0 +1 @@ +body.modal-open{overflow:hidden}.activitypub-modal__overlay{--activitypub-modal-background-color:var(--wp--preset--color--base,var(--wp--preset--color--background,#fff));--activitypub-modal-border-color:var(--wp--preset--color--contrast-3,var(--wp--preset--color--light-gray,#e2e4e7));--activitypub-modal-radius:var(--wp--custom--border--radius--medium,8px);--activitypub-modal-shadow:var(--wp--preset--shadow--natural,0 5px 15px rgba(0,0,0,.3));--activitypub-modal-compact-shadow:var(--wp--preset--shadow--natural,0 2px 8px rgba(0,0,0,.1));--activitypub-modal-text-color:var(--wp--preset--color--contrast,var(--wp--preset--color--foreground,inherit));align-items:center;background-color:rgba(0,0,0,.5);bottom:0;color:var(--activitypub-modal-text-color);display:flex;justify-content:center;right:0;margin:0!important;max-width:none!important;padding:1rem;position:fixed;left:0;top:0;z-index:100000}.activitypub-modal__overlay.compact{align-items:flex-start;background-color:transparent;bottom:auto;justify-content:flex-start;right:auto;padding:0;position:absolute;left:auto;top:auto;z-index:100}.activitypub-modal__overlay[hidden]{display:none}.activitypub-modal__frame{animation:activitypub-modal-appear .2s ease-out;background-color:var(--activitypub-modal-background-color);border:1px solid var(--activitypub-modal-border-color);border-radius:var(--activitypub-modal-radius);box-shadow:var(--activitypub-modal-shadow);box-sizing:border-box;color:var(--wp--preset--color--contrast,#1e1e1e);display:flex;flex-direction:column;font-size:inherit;max-height:calc(100vh - 2rem);max-width:660px;overflow:hidden;width:100%}.compact .activitypub-modal__frame{box-shadow:var(--activitypub-modal-compact-shadow);max-height:300px;max-width:-moz-min-content;max-width:min-content;min-width:250px;width:auto}.activitypub-modal__header{align-items:center;border-bottom:1px solid var(--activitypub-modal-border-color);display:flex;flex-shrink:0;justify-content:space-between;padding:2rem 2rem 1.5rem}.compact .activitypub-modal__header{display:none}.activitypub-modal__header .activitypub-modal__close{align-items:center;background:transparent;border:none;border-radius:var(--activitypub-modal-radius);color:inherit;cursor:pointer;display:flex;justify-content:center;padding:.5rem;width:auto}.activitypub-modal__header .activitypub-modal__close:active{border:none;padding:.5rem}.activitypub-modal__title{font-size:130%;font-weight:600;line-height:1.4;margin:0!important}.activitypub-modal__content{overflow-y:auto}.activitypub-dialog__section{border-bottom:1px solid var(--activitypub-modal-border-color,var(--wp--preset--color--light-gray,#f0f0f0));padding:1.5rem 2rem}.activitypub-dialog__section:last-child{border-bottom:none;padding-bottom:2rem}.activitypub-dialog__section h4{font-size:110%;margin-bottom:.5rem;margin-top:0}.activitypub-dialog__description{color:inherit;margin-bottom:1rem}.activitypub-dialog__button-group{align-items:center;display:flex;gap:.5rem;margin-bottom:.5rem;width:100%}.activitypub-dialog__button-group input[type]{background-color:var(--activitypub-modal-background-color,#fff)!important;border:1px solid var(--activitypub-modal-border-color,#949494)!important;border-radius:0;box-sizing:border-box;color:inherit!important;flex:1;font-family:inherit;font-size:1em;line-height:1;margin:0;min-width:0;padding:calc(.667em + 2px)!important}.activitypub-dialog__button-group input[type]::-moz-placeholder{opacity:.5}.activitypub-dialog__button-group input[type]::placeholder{opacity:.5}.activitypub-dialog__button-group input[type][aria-invalid=true]{border-color:var(--wp--preset--color--vivid-red,#b32d2e)!important}.activitypub-dialog__button-group button{background-color:var(--wp--preset--color--contrast,#1e1e1e);border:none;box-sizing:border-box;color:var(--wp--preset--color--base,#fff);cursor:pointer;font-family:inherit;font-size:1em;line-height:1;min-width:22.5%;padding:calc(.667em + 2px) 1.5em;width:auto}.activitypub-dialog__error{color:var(--wp--preset--color--vivid-red,#b32d2e);font-size:90%;margin-top:.5rem}.activitypub-dialog__remember{font-size:90%;margin-top:1rem}.activitypub-dialog__remember label{align-items:center;display:flex;gap:.5rem}.activitypub-dialog__remember input[type=checkbox]{margin:0;position:relative;top:0}@keyframes activitypub-modal-appear{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.activitypub-follow-me-block-wrapper{display:block;margin:1rem 0;position:relative}.activitypub-follow-me-block-wrapper .activitypub-profile{padding:1rem 0}.activitypub-follow-me-block-wrapper .activitypub-profile__body{display:flex;flex-wrap:wrap}.activitypub-follow-me-block-wrapper .activitypub-profile__avatar{border-radius:50%;height:75px;margin-left:1rem;-o-object-fit:cover;object-fit:cover;width:75px}.activitypub-follow-me-block-wrapper .activitypub-profile__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;justify-content:space-between;min-width:0}.activitypub-follow-me-block-wrapper .activitypub-profile__info{display:block;flex:1;min-width:0}.activitypub-follow-me-block-wrapper .activitypub-profile__name{font-size:1.25em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activitypub-follow-me-block-wrapper .activitypub-profile__handle,.activitypub-follow-me-block-wrapper .activitypub-profile__name{color:inherit;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activitypub-follow-me-block-wrapper .activitypub-profile div.wp-block-button{align-items:center;display:flex;margin:0 1rem 0 0}.activitypub-follow-me-block-wrapper .activitypub-profile .wp-block-button__link{margin:0}.activitypub-follow-me-block-wrapper .activitypub-profile .is-small{font-size:.8rem;padding:.25rem .5rem}.activitypub-follow-me-block-wrapper .activitypub-profile .is-compact{font-size:.9rem;padding:.4rem .8rem}.activitypub-follow-me-block-wrapper:not(.is-style-button-only):not(.is-style-profile) .activitypub-profile__bio,.activitypub-follow-me-block-wrapper:not(.is-style-button-only):not(.is-style-profile) .activitypub-profile__stats{display:none}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile{padding:0}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__body{display:block;padding:0}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__content{display:inline}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button{display:inline-block;margin:0}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__avatar,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__bio,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__handle,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__name,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__stats{display:none}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button.has-custom-width{display:block;max-width:none}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button.has-custom-width .wp-block-button__link{justify-content:center;width:100%}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-100{width:100%}.activitypub-follow-me-block-wrapper.is-style-profile{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.1);overflow:hidden}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile,.activitypub-follow-me-block-wrapper.is-style-profile.has-background .activitypub-profile{padding:0}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__header{background-color:#ccc;background-position:50%;background-size:cover;height:120px;width:100%}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__body{padding:1rem}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__avatar{height:64px;width:64px}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__content{flex:1;min-width:0}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__name{margin-bottom:.25rem}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__bio{font-size:90%;line-height:1.4;margin-top:16px;width:100%}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__bio p{margin:0 0 .5rem}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__bio p:last-child{margin-bottom:0}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__stats{display:flex;font-size:.9em;gap:16px;margin-top:1rem;width:100%}.activitypub-follow-me-block-wrapper.has-background .activitypub-profile,.activitypub-follow-me-block-wrapper.has-border .activitypub-profile{padding-right:1rem;padding-left:1rem} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index.css new file mode 100644 index 00000000..add70c55 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/style-index.css @@ -0,0 +1 @@ +body.modal-open{overflow:hidden}.activitypub-modal__overlay{--activitypub-modal-background-color:var(--wp--preset--color--base,var(--wp--preset--color--background,#fff));--activitypub-modal-border-color:var(--wp--preset--color--contrast-3,var(--wp--preset--color--light-gray,#e2e4e7));--activitypub-modal-radius:var(--wp--custom--border--radius--medium,8px);--activitypub-modal-shadow:var(--wp--preset--shadow--natural,0 5px 15px rgba(0,0,0,.3));--activitypub-modal-compact-shadow:var(--wp--preset--shadow--natural,0 2px 8px rgba(0,0,0,.1));--activitypub-modal-text-color:var(--wp--preset--color--contrast,var(--wp--preset--color--foreground,inherit));align-items:center;background-color:rgba(0,0,0,.5);bottom:0;color:var(--activitypub-modal-text-color);display:flex;justify-content:center;left:0;margin:0!important;max-width:none!important;padding:1rem;position:fixed;right:0;top:0;z-index:100000}.activitypub-modal__overlay.compact{align-items:flex-start;background-color:transparent;bottom:auto;justify-content:flex-start;left:auto;padding:0;position:absolute;right:auto;top:auto;z-index:100}.activitypub-modal__overlay[hidden]{display:none}.activitypub-modal__frame{animation:activitypub-modal-appear .2s ease-out;background-color:var(--activitypub-modal-background-color);border:1px solid var(--activitypub-modal-border-color);border-radius:var(--activitypub-modal-radius);box-shadow:var(--activitypub-modal-shadow);box-sizing:border-box;color:var(--wp--preset--color--contrast,#1e1e1e);display:flex;flex-direction:column;font-size:inherit;max-height:calc(100vh - 2rem);max-width:660px;overflow:hidden;width:100%}.compact .activitypub-modal__frame{box-shadow:var(--activitypub-modal-compact-shadow);max-height:300px;max-width:-moz-min-content;max-width:min-content;min-width:250px;width:auto}.activitypub-modal__header{align-items:center;border-bottom:1px solid var(--activitypub-modal-border-color);display:flex;flex-shrink:0;justify-content:space-between;padding:2rem 2rem 1.5rem}.compact .activitypub-modal__header{display:none}.activitypub-modal__header .activitypub-modal__close{align-items:center;background:transparent;border:none;border-radius:var(--activitypub-modal-radius);color:inherit;cursor:pointer;display:flex;justify-content:center;padding:.5rem;width:auto}.activitypub-modal__header .activitypub-modal__close:active{border:none;padding:.5rem}.activitypub-modal__title{font-size:130%;font-weight:600;line-height:1.4;margin:0!important}.activitypub-modal__content{overflow-y:auto}.activitypub-dialog__section{border-bottom:1px solid var(--activitypub-modal-border-color,var(--wp--preset--color--light-gray,#f0f0f0));padding:1.5rem 2rem}.activitypub-dialog__section:last-child{border-bottom:none;padding-bottom:2rem}.activitypub-dialog__section h4{font-size:110%;margin-bottom:.5rem;margin-top:0}.activitypub-dialog__description{color:inherit;margin-bottom:1rem}.activitypub-dialog__button-group{align-items:center;display:flex;gap:.5rem;margin-bottom:.5rem;width:100%}.activitypub-dialog__button-group input[type]{background-color:var(--activitypub-modal-background-color,#fff)!important;border:1px solid var(--activitypub-modal-border-color,#949494)!important;border-radius:0;box-sizing:border-box;color:inherit!important;flex:1;font-family:inherit;font-size:1em;line-height:1;margin:0;min-width:0;padding:calc(.667em + 2px)!important}.activitypub-dialog__button-group input[type]::-moz-placeholder{opacity:.5}.activitypub-dialog__button-group input[type]::placeholder{opacity:.5}.activitypub-dialog__button-group input[type][aria-invalid=true]{border-color:var(--wp--preset--color--vivid-red,#b32d2e)!important}.activitypub-dialog__button-group button{background-color:var(--wp--preset--color--contrast,#1e1e1e);border:none;box-sizing:border-box;color:var(--wp--preset--color--base,#fff);cursor:pointer;font-family:inherit;font-size:1em;line-height:1;min-width:22.5%;padding:calc(.667em + 2px) 1.5em;width:auto}.activitypub-dialog__error{color:var(--wp--preset--color--vivid-red,#b32d2e);font-size:90%;margin-top:.5rem}.activitypub-dialog__remember{font-size:90%;margin-top:1rem}.activitypub-dialog__remember label{align-items:center;display:flex;gap:.5rem}.activitypub-dialog__remember input[type=checkbox]{margin:0;position:relative;top:0}@keyframes activitypub-modal-appear{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.activitypub-follow-me-block-wrapper{display:block;margin:1rem 0;position:relative}.activitypub-follow-me-block-wrapper .activitypub-profile{padding:1rem 0}.activitypub-follow-me-block-wrapper .activitypub-profile__body{display:flex;flex-wrap:wrap}.activitypub-follow-me-block-wrapper .activitypub-profile__avatar{border-radius:50%;height:75px;margin-right:1rem;-o-object-fit:cover;object-fit:cover;width:75px}.activitypub-follow-me-block-wrapper .activitypub-profile__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;justify-content:space-between;min-width:0}.activitypub-follow-me-block-wrapper .activitypub-profile__info{display:block;flex:1;min-width:0}.activitypub-follow-me-block-wrapper .activitypub-profile__name{font-size:1.25em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activitypub-follow-me-block-wrapper .activitypub-profile__handle,.activitypub-follow-me-block-wrapper .activitypub-profile__name{color:inherit;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activitypub-follow-me-block-wrapper .activitypub-profile div.wp-block-button{align-items:center;display:flex;margin:0 0 0 1rem}.activitypub-follow-me-block-wrapper .activitypub-profile .wp-block-button__link{margin:0}.activitypub-follow-me-block-wrapper .activitypub-profile .is-small{font-size:.8rem;padding:.25rem .5rem}.activitypub-follow-me-block-wrapper .activitypub-profile .is-compact{font-size:.9rem;padding:.4rem .8rem}.activitypub-follow-me-block-wrapper:not(.is-style-button-only):not(.is-style-profile) .activitypub-profile__bio,.activitypub-follow-me-block-wrapper:not(.is-style-button-only):not(.is-style-profile) .activitypub-profile__stats{display:none}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile{padding:0}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__body{display:block;padding:0}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__content{display:inline}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button{display:inline-block;margin:0}.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__avatar,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__bio,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__handle,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__name,.activitypub-follow-me-block-wrapper.is-style-button-only .activitypub-profile__stats{display:none}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button.has-custom-width{display:block;max-width:none}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button.has-custom-width .wp-block-button__link{justify-content:center;width:100%}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.activitypub-follow-me-block-wrapper.is-style-button-only div.wp-block-button__width-100{width:100%}.activitypub-follow-me-block-wrapper.is-style-profile{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.1);overflow:hidden}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile,.activitypub-follow-me-block-wrapper.is-style-profile.has-background .activitypub-profile{padding:0}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__header{background-color:#ccc;background-position:50%;background-size:cover;height:120px;width:100%}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__body{padding:1rem}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__avatar{height:64px;width:64px}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__content{flex:1;min-width:0}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__name{margin-bottom:.25rem}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__bio{font-size:90%;line-height:1.4;margin-top:16px;width:100%}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__bio p{margin:0 0 .5rem}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__bio p:last-child{margin-bottom:0}.activitypub-follow-me-block-wrapper.is-style-profile .activitypub-profile__stats{display:flex;font-size:.9em;gap:16px;margin-top:1rem;width:100%}.activitypub-follow-me-block-wrapper.has-background .activitypub-profile,.activitypub-follow-me-block-wrapper.has-border .activitypub-profile{padding-left:1rem;padding-right:1rem} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.asset.php new file mode 100644 index 00000000..56d4b12d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.asset.php @@ -0,0 +1 @@ + array('@wordpress/interactivity'), 'version' => '5b88efee3f3b7a1605df', 'type' => 'module'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.js new file mode 100644 index 00000000..f9de5e7d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/follow-me/view.js @@ -0,0 +1 @@ +import*as t from"@wordpress/interactivity";const e=t,o=e.withSyncEvent??(t=>t),n={computedStyles:null,variables:{}};function r(t){if("undefined"==typeof window||!window.getComputedStyle)return!1;if(n.variables.hasOwnProperty(t))return n.variables[t];n.computedStyles||(n.computedStyles=window.getComputedStyle(document.documentElement));const e=n.computedStyles.getPropertyValue(t).trim();return n.variables[t]=""!==e,n.variables[t]}function l(t){if("string"!=typeof t)return null;if(t.match(/^#/))return t.substring(0,7);const[,,e]=t.split("|"),o=`--wp--preset--color--${e}`;return r(o)?`var(${o})`:null}function c(t,e,o=null,n=""){return o?`${t}${n} { ${e}: ${o}; }\n`:""}function i(t,e,o,n){return c(t,"background-color",e)+c(t,"color",o)+c(t,"background-color",n,":hover")+c(t,"background-color",n,":focus")}!function(){const{actions:t,callbacks:n}=(0,e.store)("activitypub/follow-me",{actions:{openModal(t){const o=(0,e.getContext)();if(o.modal.isOpen=!0,o.modal.isCompact)setTimeout(n.positionModal,0);else{const t=document.getElementById(o.blockId);if(t){const e=t.querySelector(".activitypub-modal__overlay");e&&["top","left","right","bottom"].forEach(t=>{e.style.removeProperty(t)})}setTimeout(()=>{if(t){const e=t.querySelector(".activitypub-modal__frame");e&&n.trapFocus(e)}},50)}"function"==typeof n.onModalOpen&&n.onModalOpen(t)},closeModal(t){const o=(0,e.getContext)();o.modal.isOpen=!1;const r=(0,e.getElement)();if("actions.toggleModal"===r.ref.dataset["wpOn-Click"])r.ref.focus();else{const t=document.getElementById(o.blockId);if(t){const e=t.querySelector('[data-wp-on--click="actions.toggleModal"]');e&&e.focus()}}"function"==typeof n.onModalClose&&n.onModalClose(t)},toggleModal:o(o=>{o?.preventDefault?.();const{modal:n}=(0,e.getContext)();n.isOpen?t.closeModal(o):t.openModal(o)})},callbacks:{_abortController:null,handleModalEffects(){const{modal:t}=(0,e.getContext)();if(t.isOpen&&!t.isCompact?document.body.classList.add("modal-open"):document.body.classList.remove("modal-open"),n._abortController&&(n._abortController.abort(),n._abortController=null),t.isOpen){n._abortController=new AbortController;const{signal:t}=n._abortController;document.addEventListener("keydown",n.documentKeydown,{signal:t}),document.addEventListener("click",n.documentClick,{signal:t})}},documentKeydown(o){const{modal:n}=(0,e.getContext)();n.isOpen&&"Escape"===o.key&&t.closeModal()},documentClick(o){const{blockId:n,modal:r}=(0,e.getContext)();if(!r.isOpen)return;const l=document.getElementById(n);if(!l)return;const c=l.querySelectorAll('[data-wp-on--click="actions.toggleModal"]');for(const t of c)if(t===o.target||t.contains(o.target))return;const i=l.querySelector(".activitypub-modal__frame");i&&!i.contains(o.target)&&t.closeModal()},positionModal(){const{blockId:t}=(0,e.getContext)(),o=document.getElementById(t);if(!o)return;const n=o.querySelector(".activitypub-modal__overlay");if(!n)return;n.style.top="",n.style.left="",n.style.right="",n.style.bottom="";const r=(0,e.getElement)().ref.getBoundingClientRect(),l=window.innerWidth,c=o.getBoundingClientRect(),i={top:r.bottom-c.top+8+"px",left:r.left-c.left-2+"px"};l-r.right<250&&(i.left="auto",i.right=c.right-r.right+"px"),Object.assign(n.style,i)},trapFocus(t){const e=t.querySelectorAll('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]):not([readonly]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])'),o=e[0],n=e[e.length-1];o&&o.classList.contains("activitypub-modal__close")&&e.length>1?e[1].focus():o.focus(),t.addEventListener("keydown",function(e){if("Tab"!==e.key&&9!==e.keyCode)return;const r=t.ownerDocument.activeElement;e.shiftKey?r===o&&(n.focus(),e.preventDefault()):r===n&&(o.focus(),e.preventDefault())})}}})}();const{actions:s,callbacks:a}=(0,e.store)("activitypub/follow-me",{actions:{copyToClipboard(){const t=(0,e.getContext)(),{i18n:o}=(0,e.getConfig)();navigator.clipboard.writeText(t.webfinger).then(()=>{t.copyButtonText=o.copied,setTimeout(()=>{t.copyButtonText=o.copy},1e3)},t=>{console.error("Could not copy text: ",t)})},updateRemoteProfile(t){const o=(0,e.getContext)();o.remoteProfile=t.target.value,o.isError=!1,o.errorMessage=""},onKeydown:o(t=>{"A"!==(0,e.getElement)().ref.tagName||"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),s.toggleModal(t))}),handleKeyDown(t){"Enter"===t.key&&(t.preventDefault(),s.submitRemoteProfile())},*submitRemoteProfile(){const t=(0,e.getContext)(),{namespace:o,i18n:n}=(0,e.getConfig)(),{apiFetch:r}=window.wp,l=t.remoteProfile.trim();if(!l)return t.isError=!0,void(t.errorMessage=n.emptyProfileError);if(!a.isHandle(l))return t.isError=!0,void(t.errorMessage=n.invalidProfileError);t.isLoading=!0,t.isError=!1;const c=`/${o}/actors/${t.userId}/remote-follow?resource=${encodeURIComponent(l)}`;try{const e=yield r({path:c});t.isLoading=!1,window.open(e.url,"_blank"),s.closeModal(new Event("click"))}catch(e){console.error("Error submitting profile:",e),t.isLoading=!1,t.isError=!0,t.errorMessage=e.message||n.genericError}}},callbacks:{initButtonStyles:()=>{const{buttonStyle:t,backgroundColor:o,blockId:n}=(0,e.getContext)();if(n&&t){const e=document.createElement("style"),c=`#${n}`;e.textContent=function(t,e,o){const n=`${t} .wp-block-button__link`,c=function(t){if("string"==typeof t){const e=`--wp--preset--color--${t}`;return r(e)?`var(${e})`:null}return t?.color?.background||null}(o)||e?.color?.background;return i(n,l(e?.elements?.link?.color?.text),c,l(e?.elements?.link?.[":hover"]?.color?.text))}(c,t,o),document.head.appendChild(e);const s=document.createElement("style");s.textContent=function(t){const e=l(t?.elements?.link?.color?.text)||"var(--wp--preset--color--contrast, var(--wp--preset--color--foreground, #1e1e1e))";return i(".activitypub-dialog__button-group .wp-block-button__link",e,"var(--wp--preset--color--base, var(--wp--preset--color--background, #fff))",l(t?.elements?.link?.[":hover"]?.color?.text)||e)}(t),document.head.appendChild(s)}},isHandle(t){const e=t.replace(/^@/,"").split("@");return 2===e.length&&a.isUrl(`https://${e[1]}`)},isUrl(t){try{return new URL(t),!0}catch(t){return!1}},onModalClose(){(0,e.getContext)().isError=!1}}}); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/block.json b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/block.json new file mode 100644 index 00000000..d0f0317f --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/block.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "name": "activitypub/followers", + "apiVersion": 3, + "version": "8.3.0", + "title": "Fediverse Followers", + "category": "widgets", + "description": "Display your followers from the Fediverse on your website.", + "textdomain": "activitypub", + "icon": "groups", + "keywords": [ + "fediverse", + "activitypub", + "followers", + "mastodon" + ], + "supports": { + "html": false, + "interactivity": true + }, + "attributes": { + "selectedUser": { + "type": "string", + "default": "blog" + }, + "per_page": { + "type": "number", + "default": 10 + }, + "order": { + "type": "string", + "default": "desc", + "enum": [ + "asc", + "desc" + ] + } + }, + "usesContext": [ + "postType", + "postId" + ], + "styles": [ + { + "name": "default", + "label": "Default", + "isDefault": true + }, + { + "name": "card", + "label": "Card" + }, + { + "name": "compact", + "label": "Compact" + } + ], + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "viewScriptModule": "file:./view.js", + "viewScript": "wp-api-fetch", + "style": [ + "file:./style-index.css" + ], + "render": "file:./render.php" +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.asset.php new file mode 100644 index 00000000..c3fe904d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.asset.php @@ -0,0 +1 @@ + array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-url'), 'version' => 'da88cfc334f994481a92'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.js new file mode 100644 index 00000000..6d6ff015 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/index.js @@ -0,0 +1,3 @@ +(()=>{"use strict";var e,t={4736(e,t,i){const a=window.wp.blocks,r=window.wp.primitives,s=window.ReactJSXRuntime;var n=(0,s.jsx)(r.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,s.jsx)(r.Path,{fillRule:"evenodd",d:"M15.5 9.5a1 1 0 100-2 1 1 0 000 2zm0 1.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5zm-2.25 6v-2a2.75 2.75 0 00-2.75-2.75h-4A2.75 2.75 0 003.75 15v2h1.5v-2c0-.69.56-1.25 1.25-1.25h4c.69 0 1.25.56 1.25 1.25v2h1.5zm7-2v2h-1.5v-2c0-.69-.56-1.25-1.25-1.25H15v-1.5h2.5A2.75 2.75 0 0120.25 15zM9.5 8.5a1 1 0 11-2 0 1 1 0 012 0zm1.5 0a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z"})});const o=[{attributes:{title:{type:"string",default:"Fediverse Followers"},selectedUser:{type:"string",default:"blog"},per_page:{type:"number",default:10},order:{type:"string",default:"desc",enum:["asc","desc"]}},supports:{html:!1},isEligible:({title:e})=>!!e,migrate:({title:e,...t})=>[t,[(0,a.createBlock)("core/heading",{content:e,level:3})]]}],l=window.wp.components,c=window.wp.blockEditor,p=window.wp.coreData,u=window.wp.data,d=window.wp.element,v=window.wp.i18n,h=window.wp.apiFetch;var b=i.n(h);function g(){return window._activityPubOptions||{}}function f({name:e}){const{enabled:t}=g(),i=t?.blog?"":(0,v.__)("It will be empty in other non-author contexts.","activitypub"),a=(0,v.sprintf)(/* translators: %1$s: block name, %2$s: extra information for non-author context */ /* translators: %1$s: block name, %2$s: extra information for non-author context */ +(0,v.__)("This %1$s block will adapt to the page it is on, displaying the user profile associated with a post author (in a loop) or a user archive. %2$s","activitypub"),e,i).trim();return(0,s.jsx)(l.Card,{children:(0,s.jsx)(l.CardBody,{children:(0,d.createInterpolateElement)(a,{strong:(0,s.jsx)("strong",{})})})})}const w=window.wp.url;function y({name:e,icon:t,url:i,webfinger:a}){const r=`@${a}`,{defaultAvatarUrl:n,showAvatars:o}=g(),l=t?.url||n;return(0,s.jsxs)("a",{className:"activitypub-actor-link",href:i,title:r,onClick:e=>e.preventDefault(),children:[o&&(0,s.jsx)("img",{width:"48",height:"48",src:l,className:"activitypub-actor-avatar",alt:e,onError:e=>{e.target.src=n}}),(0,s.jsxs)("div",{className:"activitypub-actor-info",children:[(0,s.jsx)("span",{className:"activitypub-actor-name",children:e}),(0,s.jsx)("span",{className:"activitypub-actor-handle",children:r})]}),(0,s.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"24",height:"24",className:"external-link-icon","aria-hidden":"true",focusable:"false",fill:"currentColor",children:(0,s.jsx)("path",{d:"M18.2 17c0 .7-.6 1.2-1.2 1.2H7c-.7 0-1.2-.6-1.2-1.2V7c0-.7.6-1.2 1.2-1.2h3.2V4.2H7C5.5 4.2 4.2 5.5 4.2 7v10c0 1.5 1.2 2.8 2.8 2.8h10c1.5 0 2.8-1.2 2.8-2.8v-3.6h-1.5V17zM14.9 3v1.5h3.7l-6.4 6.4 1.1 1.1 6.4-6.4v3.7h1.5V3h-6.3z"})})]})}function m({page:e,pages:t,setPage:i,navLabel:a=(0,v.__)("Navigation","activitypub")}){if(t<=1)return null;const r=e<=1,n=e>=t;return(0,s.jsxs)("nav",{className:"activitypub-actor-list-pagination",role:"navigation",children:[(0,s.jsx)("h1",{className:"screen-reader-text",children:a}),(0,s.jsx)("a",{role:"button",tabIndex:0,className:"pagination-previous","aria-disabled":r,"aria-label":(0,v.__)("Previous page","activitypub"),onClick:()=>{r||i(e-1)},onKeyDown:t=>{r||"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),i(e-1))},children:(0,v.__)("Previous","activitypub")}),(0,s.jsx)("div",{className:"pagination-info",children:`${e} / ${t}`}),(0,s.jsx)("a",{role:"button",tabIndex:0,className:"pagination-next","aria-disabled":n,"aria-label":(0,v.__)("Next page","activitypub"),onClick:()=>{n||i(e+1)},onKeyDown:t=>{n||"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),i(e+1))},children:(0,v.__)("Next","activitypub")})]})}function _({selectedUser:e,perPage:t,order:i,endpoint:a="followers",page:r,setPage:n,initialData:o=!1,emptyMessage:l=(0,v.__)("No results found.","activitypub"),navLabel:c=(0,v.__)("Navigation","activitypub")}){const{namespace:p}=g(),u="blog"===e?0:e,[h,f]=(0,d.useState)([]),[_,x]=(0,d.useState)(0),[j,k]=(0,d.useState)(1),N=r||j,S=n||k,U=(0,d.useCallback)((e,i)=>{f(e),x(Math.ceil(i/t))},[t]);return(0,d.useEffect)(()=>{if(o&&1===N)return U(o.items,o.total);const e=(0,w.addQueryArgs)(`/${p}/actors/${u}/${a}`,{per_page:t,order:i,page:N,context:"full"});b()({path:e}).then(({orderedItems:e=[],totalItems:t=0})=>U(e,t)).catch(()=>U([],0))},[p,u,t,i,N,a,o,U]),(0,s.jsxs)("div",{className:"activitypub-actor-list-container",children:[h.length?(0,s.jsx)("ul",{className:"activitypub-actor-list",children:h.map(e=>(0,s.jsx)("li",{className:"activitypub-actor-item",children:(0,s.jsx)(y,{...e})},e.url))}):(0,s.jsx)("p",{className:"activitypub-actor-list-placeholder",children:l}),(0,s.jsx)(m,{page:N,pages:_,setPage:S,navLabel:c})]})}function x(e){return!!e&&Object.entries(e).some(([e,t])=>e.endsWith("activitypub_hide_social_graph")&&t)}const j=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","name":"activitypub/followers","apiVersion":3,"version":"8.2.1","title":"Fediverse Followers","category":"widgets","description":"Display your followers from the Fediverse on your website.","textdomain":"activitypub","icon":"groups","keywords":["fediverse","activitypub","followers","mastodon"],"supports":{"html":false,"interactivity":true},"attributes":{"selectedUser":{"type":"string","default":"blog"},"per_page":{"type":"number","default":10},"order":{"type":"string","default":"desc","enum":["asc","desc"]}},"usesContext":["postType","postId"],"styles":[{"name":"default","label":"Default","isDefault":true},{"name":"card","label":"Card"},{"name":"compact","label":"Compact"}],"editorScript":"file:./index.js","editorStyle":"file:./index.css","viewScriptModule":"file:./view.js","viewScript":"wp-api-fetch","style":["file:./style-index.css"],"render":"file:./render.php"}');(0,a.registerBlockType)(j,{deprecated:o,edit:function({attributes:e,setAttributes:t,context:{postType:i,postId:a}}){const{className:r="",order:n,per_page:o,selectedUser:h}=e,w=(0,c.useBlockProps)(),[y,m]=(0,d.useState)(1),j=[{label:(0,v.__)("New to old","activitypub"),value:"desc"},{label:(0,v.__)("Old to new","activitypub"),value:"asc"}],k=function({withInherit:e=!1}){const{enabled:t,namespace:i}=g(),[a,r]=(0,d.useState)(!1),{fetchedUsers:s,isLoadingUsers:n}=(0,u.useSelect)(e=>{const{getUsers:i,getIsResolving:a}=e("core");return{fetchedUsers:t?.users?i({capabilities:"activitypub"}):null,isLoadingUsers:!!t?.users&&a("getUsers",[{capabilities:"activitypub"}])}},[t?.users]),o=(0,u.useSelect)(e=>s||n?null:e("core").getCurrentUser(),[s,n]);(0,d.useEffect)(()=>{!s&&!n&&o&&i&&b()({path:`/${i}/actors/${o.id}`,method:"HEAD",headers:{Accept:"application/activity+json"},parse:!1}).then(()=>r(!0)).catch(()=>r(!1))},[s,n,o,i]);const l=(0,d.useMemo)(()=>s||(o&&a?[{id:o.id,name:o.name}]:[]),[s,o,a]);return(0,d.useMemo)(()=>{if(!l.length)return[];const i=[];return t?.blog&&s&&i.push({label:(0,v.__)("Blog","activitypub"),value:"blog"}),e&&t?.users&&s&&i.push({label:(0,v.__)("Dynamic User","activitypub"),value:"inherit"}),l.reduce((e,t)=>(e.push({label:t.name,value:`${t.id}`}),e),i)},[l,t?.blog,t?.users,s,e])}({withInherit:!0}),N=e=>i=>{m(1),t({[e]:i})},{blogSocialGraphHidden:S,currentUser:U,usersWithMeta:C,siteUrl:M,canManageOptions:O}=(0,u.useSelect)(e=>{const{getCurrentUser:t,getUsers:i,getEntityRecord:a,canUser:r}=e(p.store),s=a("root","site"),n=a("root","__unstableBase");return{blogSocialGraphHidden:!!s?.activitypub_hide_social_graph,currentUser:t(),usersWithMeta:i({capabilities:"activitypub",context:"edit"}),siteUrl:n?.home,canManageOptions:r("update",{kind:"root",name:"site"})}},[]),P=(0,u.useSelect)(e=>{const{getEditedEntityRecord:t}=e(p.store),r=t("postType",i,a)?.author;return r??null},[i,a]),D=(0,d.useMemo)(()=>k.length&&C?k.filter(({value:e})=>{if("inherit"===e)return!0;if("blog"===e)return!S;const t=C?.find(t=>String(t.id)===e);return!x(t?.meta)}):[],[k,S,C]),E=(0,d.useMemo)(()=>{if(!C)return!1;if("blog"===h)return S;if("inherit"===h){if(!P)return!1;const e=C.find(e=>e.id===P);return!!e&&x(e.meta)}return!1},[h,P,C,S]),F=(0,d.useMemo)(()=>!(!E||!U)&&("blog"===h?O:U.id===P),[E,U,h,P,O]),I=(0,d.useMemo)(()=>F&&M?"blog"===h?M+"/wp-admin/options-general.php?page=activitypub&tab=blog-profile":M+"/wp-admin/profile.php#activitypub":null,[F,M,h]);(0,d.useEffect)(()=>{D.length&&("blog"===h||"inherit"===h||D.find(({value:e})=>e===h)||t({selectedUser:D[0].value}))},[h,D,t]);const B=[["core/heading",{level:3,placeholder:(0,v.__)("Fediverse Followers","activitypub"),content:(0,v.__)("Fediverse Followers","activitypub")}]];return(0,s.jsxs)("div",{...w,children:[(0,s.jsx)(c.InspectorControls,{children:(0,s.jsxs)(l.PanelBody,{title:(0,v.__)("Followers Options","activitypub"),children:[D.length>1&&(0,s.jsx)(l.SelectControl,{label:(0,v.__)("Select User","activitypub"),value:h,options:D,onChange:N("selectedUser"),__next40pxDefaultSize:!0}),(0,s.jsx)(l.SelectControl,{label:(0,v.__)("Sort","activitypub"),value:n,options:j,onChange:N("order"),__next40pxDefaultSize:!0}),(0,s.jsx)(l.RangeControl,{label:(0,v.__)("Number of Followers","activitypub"),value:o,onChange:N("per_page"),min:1,max:10,__next40pxDefaultSize:!0})]})},"setting"),(0,s.jsxs)("div",{className:"wp-block-activitypub-followers "+r,children:[(0,s.jsx)(c.InnerBlocks,{template:B,allowedBlocks:["core/heading"],templateLock:"all",renderAppender:!1}),E&&(0,s.jsx)(l.Notice,{status:"warning",isDismissible:!1,children:I?(0,d.createInterpolateElement)(/* translators: is a link to the profile settings page. */ /* translators: is a link to the profile settings page. */ +(0,v.__)("The selected user has their social graph hidden. This block will not display followers on the frontend. Edit privacy settings","activitypub"),{a:(0,s.jsx)("a",{href:I,target:"_blank",rel:"noopener noreferrer"})}):(0,v.__)("The selected user has their social graph hidden. This block will not display followers on the frontend.","activitypub")}),!E&&"inherit"===h&&P&&(0,s.jsx)(_,{selectedUser:P,perPage:o,order:n,endpoint:"followers",page:y,setPage:m,emptyMessage:(0,v.__)("No followers found.","activitypub"),navLabel:(0,v.__)("Follower navigation","activitypub")}),!E&&"inherit"===h&&!P&&(0,s.jsx)(f,{name:(0,v.__)("Followers","activitypub")}),!E&&"inherit"!==h&&(0,s.jsx)(_,{selectedUser:h,perPage:o,order:n,endpoint:"followers",page:y,setPage:m,emptyMessage:(0,v.__)("No followers found.","activitypub"),navLabel:(0,v.__)("Follower navigation","activitypub")})]})]})},save:function(){const e=c.useBlockProps.save(),t=c.useInnerBlocksProps.save(e);return(0,s.jsx)("div",{...t})},icon:n})}},i={};function a(e){var r=i[e];if(void 0!==r)return r.exports;var s=i[e]={exports:{}};return t[e](s,s.exports,a),s.exports}a.m=t,e=[],a.O=(t,i,r,s)=>{if(!i){var n=1/0;for(p=0;p=s)&&Object.keys(a.O).every(e=>a.O[e](i[l]))?i.splice(l--,1):(o=!1,s0&&e[p-1][2]>s;p--)e[p]=e[p-1];e[p]=[i,r,s]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var i in t)a.o(t,i)&&!a.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={149:0,17:0};a.O.j=t=>0===e[t];var t=(t,i)=>{var r,s,[n,o,l]=i,c=0;if(n.some(t=>0!==e[t])){for(r in o)a.o(o,r)&&(a.m[r]=o[r]);if(l)var p=l(a)}for(t&&t(i);ca(4736));r=a.O(r)})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/render.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/render.php new file mode 100644 index 00000000..fc5cc81e --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/render.php @@ -0,0 +1,20 @@ + array('@wordpress/interactivity'), 'version' => '2f63eedc944f22daa7c0', 'type' => 'module'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/view.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/view.js new file mode 100644 index 00000000..06e1914d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/followers/view.js @@ -0,0 +1 @@ +import*as e from"@wordpress/interactivity";const t=e,a=t.withSyncEvent??(e=>e);!function(){const{actions:e}=(0,t.store)("activitypub/followers",{state:{get paginationText(){const{page:e,pages:a}=(0,t.getContext)();return`${e} / ${a}`},get disablePreviousLink(){const{page:e}=(0,t.getContext)();return e<=1},get disableNextLink(){const{page:e,pages:a}=(0,t.getContext)();return e>=a}},actions:{async fetchItems(){const e=(0,t.getContext)(),{userId:a,page:n,perPage:r,order:o,endpoint:s}=e,{apiFetch:g,url:i}=window.wp;e.isLoading=!0;try{const{namespace:c}=(0,t.getConfig)(),p=i.addQueryArgs(`/${c}/actors/${a}/${s}`,{context:"full",per_page:r,order:o,page:n}),{orderedItems:l,totalItems:d}=await g({path:p});e.items=l.map(e=>({handle:"@"+e.webfinger,icon:e.icon,name:e.name||e.preferredUsername,url:e.url||e.id})),e.total=d,e.pages=Math.ceil(d/r)}catch(e){console.error(`Error fetching ${s}:`,e)}finally{e.isLoading=!1}},previousPage:a(a=>{a.preventDefault();const n=(0,t.getContext)();n.page>1&&(n.page--,e.fetchItems())}),nextPage:a(a=>{a.preventDefault();const n=(0,t.getContext)();n.page array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-url'), 'version' => '579447d958b5f1081d10'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/index.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/index.js new file mode 100644 index 00000000..cb2c8053 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/index.js @@ -0,0 +1,3 @@ +(()=>{"use strict";var e,t={3508(e,t,i){const a=window.wp.blocks,s=window.wp.primitives,n=window.ReactJSXRuntime;var r=(0,n.jsx)(s.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,n.jsx)(s.Path,{fillRule:"evenodd",d:"M15.5 9.5a1 1 0 100-2 1 1 0 000 2zm0 1.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5zm-2.25 6v-2a2.75 2.75 0 00-2.75-2.75h-4A2.75 2.75 0 003.75 15v2h1.5v-2c0-.69.56-1.25 1.25-1.25h4c.69 0 1.25.56 1.25 1.25v2h1.5zm7-2v2h-1.5v-2c0-.69-.56-1.25-1.25-1.25H15v-1.5h2.5A2.75 2.75 0 0120.25 15zM9.5 8.5a1 1 0 11-2 0 1 1 0 012 0zm1.5 0a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z"})});const o=[{attributes:{title:{type:"string",default:"Fediverse Following"},selectedUser:{type:"string",default:"blog"},per_page:{type:"number",default:10},order:{type:"string",default:"desc",enum:["asc","desc"]}},supports:{html:!1},isEligible:({title:e})=>!!e,migrate:({title:e,...t})=>[t,[(0,a.createBlock)("core/heading",{content:e,level:3})]]}],l=window.wp.components,c=window.wp.blockEditor,p=window.wp.coreData,u=window.wp.data,d=window.wp.element,h=window.wp.i18n,v=window.wp.apiFetch;var g=i.n(v);function b(){return window._activityPubOptions||{}}function y({name:e}){const{enabled:t}=b(),i=t?.blog?"":(0,h.__)("It will be empty in other non-author contexts.","activitypub"),a=(0,h.sprintf)(/* translators: %1$s: block name, %2$s: extra information for non-author context */ /* translators: %1$s: block name, %2$s: extra information for non-author context */ +(0,h.__)("This %1$s block will adapt to the page it is on, displaying the user profile associated with a post author (in a loop) or a user archive. %2$s","activitypub"),e,i).trim();return(0,n.jsx)(l.Card,{children:(0,n.jsx)(l.CardBody,{children:(0,d.createInterpolateElement)(a,{strong:(0,n.jsx)("strong",{})})})})}const f=window.wp.url;function w({name:e,icon:t,url:i,webfinger:a}){const s=`@${a}`,{defaultAvatarUrl:r,showAvatars:o}=b(),l=t?.url||r;return(0,n.jsxs)("a",{className:"activitypub-actor-link",href:i,title:s,onClick:e=>e.preventDefault(),children:[o&&(0,n.jsx)("img",{width:"48",height:"48",src:l,className:"activitypub-actor-avatar",alt:e,onError:e=>{e.target.src=r}}),(0,n.jsxs)("div",{className:"activitypub-actor-info",children:[(0,n.jsx)("span",{className:"activitypub-actor-name",children:e}),(0,n.jsx)("span",{className:"activitypub-actor-handle",children:s})]}),(0,n.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"24",height:"24",className:"external-link-icon","aria-hidden":"true",focusable:"false",fill:"currentColor",children:(0,n.jsx)("path",{d:"M18.2 17c0 .7-.6 1.2-1.2 1.2H7c-.7 0-1.2-.6-1.2-1.2V7c0-.7.6-1.2 1.2-1.2h3.2V4.2H7C5.5 4.2 4.2 5.5 4.2 7v10c0 1.5 1.2 2.8 2.8 2.8h10c1.5 0 2.8-1.2 2.8-2.8v-3.6h-1.5V17zM14.9 3v1.5h3.7l-6.4 6.4 1.1 1.1 6.4-6.4v3.7h1.5V3h-6.3z"})})]})}function m({page:e,pages:t,setPage:i,navLabel:a=(0,h.__)("Navigation","activitypub")}){if(t<=1)return null;const s=e<=1,r=e>=t;return(0,n.jsxs)("nav",{className:"activitypub-actor-list-pagination",role:"navigation",children:[(0,n.jsx)("h1",{className:"screen-reader-text",children:a}),(0,n.jsx)("a",{role:"button",tabIndex:0,className:"pagination-previous","aria-disabled":s,"aria-label":(0,h.__)("Previous page","activitypub"),onClick:()=>{s||i(e-1)},onKeyDown:t=>{s||"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),i(e-1))},children:(0,h.__)("Previous","activitypub")}),(0,n.jsx)("div",{className:"pagination-info",children:`${e} / ${t}`}),(0,n.jsx)("a",{role:"button",tabIndex:0,className:"pagination-next","aria-disabled":r,"aria-label":(0,h.__)("Next page","activitypub"),onClick:()=>{r||i(e+1)},onKeyDown:t=>{r||"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),i(e+1))},children:(0,h.__)("Next","activitypub")})]})}function _({selectedUser:e,perPage:t,order:i,endpoint:a="followers",page:s,setPage:r,initialData:o=!1,emptyMessage:l=(0,h.__)("No results found.","activitypub"),navLabel:c=(0,h.__)("Navigation","activitypub")}){const{namespace:p}=b(),u="blog"===e?0:e,[v,y]=(0,d.useState)([]),[_,x]=(0,d.useState)(0),[j,k]=(0,d.useState)(1),N=s||j,S=r||k,U=(0,d.useCallback)((e,i)=>{y(e),x(Math.ceil(i/t))},[t]);return(0,d.useEffect)(()=>{if(o&&1===N)return U(o.items,o.total);const e=(0,f.addQueryArgs)(`/${p}/actors/${u}/${a}`,{per_page:t,order:i,page:N,context:"full"});g()({path:e}).then(({orderedItems:e=[],totalItems:t=0})=>U(e,t)).catch(()=>U([],0))},[p,u,t,i,N,a,o,U]),(0,n.jsxs)("div",{className:"activitypub-actor-list-container",children:[v.length?(0,n.jsx)("ul",{className:"activitypub-actor-list",children:v.map(e=>(0,n.jsx)("li",{className:"activitypub-actor-item",children:(0,n.jsx)(w,{...e})},e.url))}):(0,n.jsx)("p",{className:"activitypub-actor-list-placeholder",children:l}),(0,n.jsx)(m,{page:N,pages:_,setPage:S,navLabel:c})]})}function x(e){return!!e&&Object.entries(e).some(([e,t])=>e.endsWith("activitypub_hide_social_graph")&&t)}const j=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","name":"activitypub/following","apiVersion":3,"version":"8.2.1","title":"Fediverse Following","category":"widgets","description":"Display the accounts you follow in the Fediverse on your website.","textdomain":"activitypub","icon":"groups","keywords":["fediverse","activitypub","following","mastodon"],"supports":{"html":false,"interactivity":true},"attributes":{"selectedUser":{"type":"string","default":"blog"},"per_page":{"type":"number","default":10},"order":{"type":"string","default":"desc","enum":["asc","desc"]}},"usesContext":["postType","postId"],"styles":[{"name":"default","label":"Default","isDefault":true},{"name":"card","label":"Card"},{"name":"compact","label":"Compact"}],"editorScript":"file:./index.js","editorStyle":"file:./index.css","viewScriptModule":"file:./view.js","viewScript":"wp-api-fetch","style":["file:./style-index.css"],"render":"file:./render.php"}');(0,a.registerBlockType)(j,{deprecated:o,edit:function({attributes:e,setAttributes:t,context:{postType:i,postId:a}}){const{className:s="",order:r,per_page:o,selectedUser:v}=e,f=(0,c.useBlockProps)(),[w,m]=(0,d.useState)(1),j=[{label:(0,h.__)("New to old","activitypub"),value:"desc"},{label:(0,h.__)("Old to new","activitypub"),value:"asc"}],k=function({withInherit:e=!1}){const{enabled:t,namespace:i}=b(),[a,s]=(0,d.useState)(!1),{fetchedUsers:n,isLoadingUsers:r}=(0,u.useSelect)(e=>{const{getUsers:i,getIsResolving:a}=e("core");return{fetchedUsers:t?.users?i({capabilities:"activitypub"}):null,isLoadingUsers:!!t?.users&&a("getUsers",[{capabilities:"activitypub"}])}},[t?.users]),o=(0,u.useSelect)(e=>n||r?null:e("core").getCurrentUser(),[n,r]);(0,d.useEffect)(()=>{!n&&!r&&o&&i&&g()({path:`/${i}/actors/${o.id}`,method:"HEAD",headers:{Accept:"application/activity+json"},parse:!1}).then(()=>s(!0)).catch(()=>s(!1))},[n,r,o,i]);const l=(0,d.useMemo)(()=>n||(o&&a?[{id:o.id,name:o.name}]:[]),[n,o,a]);return(0,d.useMemo)(()=>{if(!l.length)return[];const i=[];return t?.blog&&n&&i.push({label:(0,h.__)("Blog","activitypub"),value:"blog"}),e&&t?.users&&n&&i.push({label:(0,h.__)("Dynamic User","activitypub"),value:"inherit"}),l.reduce((e,t)=>(e.push({label:t.name,value:`${t.id}`}),e),i)},[l,t?.blog,t?.users,n,e])}({withInherit:!0}),N=e=>i=>{m(1),t({[e]:i})},{blogSocialGraphHidden:S,currentUser:U,usersWithMeta:C,siteUrl:M,canManageOptions:O}=(0,u.useSelect)(e=>{const{getCurrentUser:t,getUsers:i,getEntityRecord:a,canUser:s}=e(p.store),n=a("root","site"),r=a("root","__unstableBase");return{blogSocialGraphHidden:!!n?.activitypub_hide_social_graph,currentUser:t(),usersWithMeta:i({capabilities:"activitypub",context:"edit"}),siteUrl:r?.home,canManageOptions:s("update",{kind:"root",name:"site"})}},[]),P=(0,u.useSelect)(e=>{const{getEditedEntityRecord:t}=e(p.store),s=t("postType",i,a)?.author;return s??null},[i,a]),E=(0,d.useMemo)(()=>k.length&&C?k.filter(({value:e})=>{if("inherit"===e)return!0;if("blog"===e)return!S;const t=C?.find(t=>String(t.id)===e);return!x(t?.meta)}):[],[k,S,C]),D=(0,d.useMemo)(()=>{if(!C)return!1;if("blog"===v)return S;if("inherit"===v){if(!P)return!1;const e=C.find(e=>e.id===P);return!!e&&x(e.meta)}return!1},[v,P,C,S]),F=(0,d.useMemo)(()=>!(!D||!U)&&("blog"===v?O:U.id===P),[D,U,v,P,O]),I=(0,d.useMemo)(()=>F&&M?"blog"===v?M+"/wp-admin/options-general.php?page=activitypub&tab=blog-profile":M+"/wp-admin/profile.php#activitypub":null,[F,M,v]);(0,d.useEffect)(()=>{E.length&&("blog"===v||"inherit"===v||E.find(({value:e})=>e===v)||t({selectedUser:E[0].value}))},[v,E,t]);const B=[["core/heading",{level:3,placeholder:(0,h.__)("Fediverse Following","activitypub"),content:(0,h.__)("Fediverse Following","activitypub")}]];return(0,n.jsxs)("div",{...f,children:[(0,n.jsx)(c.InspectorControls,{children:(0,n.jsxs)(l.PanelBody,{title:(0,h.__)("Following Options","activitypub"),children:[E.length>1&&(0,n.jsx)(l.SelectControl,{label:(0,h.__)("Select User","activitypub"),value:v,options:E,onChange:N("selectedUser"),__next40pxDefaultSize:!0}),(0,n.jsx)(l.SelectControl,{label:(0,h.__)("Sort","activitypub"),value:r,options:j,onChange:N("order"),__next40pxDefaultSize:!0}),(0,n.jsx)(l.RangeControl,{label:(0,h.__)("Number of Following","activitypub"),value:o,onChange:N("per_page"),min:1,max:10,__next40pxDefaultSize:!0})]})},"setting"),(0,n.jsxs)("div",{className:`wp-block-activitypub-following ${s}`,children:[(0,n.jsx)(c.InnerBlocks,{template:B,allowedBlocks:["core/heading"],templateLock:"all",renderAppender:!1}),D&&(0,n.jsx)(l.Notice,{status:"warning",isDismissible:!1,children:I?(0,d.createInterpolateElement)(/* translators: is a link to the profile settings page. */ /* translators: is a link to the profile settings page. */ +(0,h.__)("The selected user has their social graph hidden. This block will not display following on the frontend. Edit privacy settings","activitypub"),{a:(0,n.jsx)(l.ExternalLink,{href:I})}):(0,h.__)("The selected user has their social graph hidden. This block will not display following on the frontend.","activitypub")}),!D&&"inherit"===v&&P&&(0,n.jsx)(_,{selectedUser:P,perPage:o,order:r,endpoint:"following",page:w,setPage:m,emptyMessage:(0,h.__)("Not following anyone yet.","activitypub"),navLabel:(0,h.__)("Following navigation","activitypub")}),!D&&"inherit"===v&&!P&&(0,n.jsx)(y,{name:(0,h.__)("Following","activitypub")}),!D&&"inherit"!==v&&(0,n.jsx)(_,{selectedUser:v,perPage:o,order:r,endpoint:"following",page:w,setPage:m,emptyMessage:(0,h.__)("Not following anyone yet.","activitypub"),navLabel:(0,h.__)("Following navigation","activitypub")})]})]})},save:function(){const e=c.useBlockProps.save(),t=c.useInnerBlocksProps.save(e);return(0,n.jsx)("div",{...t})},icon:r})}},i={};function a(e){var s=i[e];if(void 0!==s)return s.exports;var n=i[e]={exports:{}};return t[e](n,n.exports,a),n.exports}a.m=t,e=[],a.O=(t,i,s,n)=>{if(!i){var r=1/0;for(p=0;p=n)&&Object.keys(a.O).every(e=>a.O[e](i[l]))?i.splice(l--,1):(o=!1,n0&&e[p-1][2]>n;p--)e[p]=e[p-1];e[p]=[i,s,n]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var i in t)a.o(t,i)&&!a.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={801:0,509:0};a.O.j=t=>0===e[t];var t=(t,i)=>{var s,n,[r,o,l]=i,c=0;if(r.some(t=>0!==e[t])){for(s in o)a.o(o,s)&&(a.m[s]=o[s]);if(l)var p=l(a)}for(t&&t(i);ca(3508));s=a.O(s)})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/render.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/render.php new file mode 100644 index 00000000..8bc91290 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/render.php @@ -0,0 +1,20 @@ + array('@wordpress/interactivity'), 'version' => '94e5efb023ccc7caf799', 'type' => 'module'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/view.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/view.js new file mode 100644 index 00000000..0d3263d7 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/following/view.js @@ -0,0 +1 @@ +import*as e from"@wordpress/interactivity";const t=e,a=t.withSyncEvent??(e=>e);!function(){const{actions:e}=(0,t.store)("activitypub/following",{state:{get paginationText(){const{page:e,pages:a}=(0,t.getContext)();return`${e} / ${a}`},get disablePreviousLink(){const{page:e}=(0,t.getContext)();return e<=1},get disableNextLink(){const{page:e,pages:a}=(0,t.getContext)();return e>=a}},actions:{async fetchItems(){const e=(0,t.getContext)(),{userId:a,page:n,perPage:r,order:o,endpoint:s}=e,{apiFetch:g,url:i}=window.wp;e.isLoading=!0;try{const{namespace:c}=(0,t.getConfig)(),p=i.addQueryArgs(`/${c}/actors/${a}/${s}`,{context:"full",per_page:r,order:o,page:n}),{orderedItems:l,totalItems:d}=await g({path:p});e.items=l.map(e=>({handle:"@"+e.webfinger,icon:e.icon,name:e.name||e.preferredUsername,url:e.url||e.id})),e.total=d,e.pages=Math.ceil(d/r)}catch(e){console.error(`Error fetching ${s}:`,e)}finally{e.isLoading=!1}},previousPage:a(a=>{a.preventDefault();const n=(0,t.getContext)();n.page>1&&(n.page--,e.fetchItems())}),nextPage:a(a=>{a.preventDefault();const n=(0,t.getContext)();n.page array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-i18n'), 'version' => 'c8dfeeece9537c9d6183'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/index.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/index.js new file mode 100644 index 00000000..0fa2b88e --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/index.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,t={5879(){const e=window.wp.blocks,t=window.wp.blockEditor,i=window.wp.components,s=window.wp.i18n,r=window.ReactJSXRuntime,o=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","name":"activitypub/posts-and-replies","apiVersion":3,"version":"unreleased","title":"Posts and Replies","category":"widgets","description":"Display a tab bar to filter between posts only and posts with replies on author archives.","textdomain":"activitypub","icon":"admin-post","keywords":["fediverse","activitypub","posts","replies","tabs"],"supports":{"html":false},"editorScript":"file:./index.js","style":["file:./style-index.css"],"render":"file:./render.php"}');(0,e.registerBlockType)(o,{edit:function(){const e=(0,t.useBlockProps)();return(0,r.jsx)("div",{...e,children:(0,r.jsx)(i.Placeholder,{icon:"admin-post",label:(0,s.__)("Posts and Replies","activitypub"),instructions:(0,s.__)('Displays a tab bar to filter between "Posts" (excluding replies) and "Posts & Replies" on author archives. Place above a Query Loop block with "Inherit query from template" enabled.',"activitypub")})})},save:()=>null})}},i={};function s(e){var r=i[e];if(void 0!==r)return r.exports;var o=i[e]={exports:{}};return t[e](o,o.exports,s),o.exports}s.m=t,e=[],s.O=(t,i,r,o)=>{if(!i){var n=1/0;for(c=0;c=o)&&Object.keys(s.O).every(e=>s.O[e](i[p]))?i.splice(p--,1):(a=!1,o0&&e[c-1][2]>o;c--)e[c]=e[c-1];e[c]=[i,r,o]},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={642:0,6:0};s.O.j=t=>0===e[t];var t=(t,i)=>{var r,o,[n,a,p]=i,l=0;if(n.some(t=>0!==e[t])){for(r in a)s.o(a,r)&&(s.m[r]=a[r]);if(p)var c=p(s)}for(t&&t(i);ls(5879));r=s.O(r)})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/render.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/render.php new file mode 100644 index 00000000..dcf9e7a6 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/render.php @@ -0,0 +1,54 @@ + + diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index-rtl.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index-rtl.css new file mode 100644 index 00000000..1b83fa7b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index-rtl.css @@ -0,0 +1 @@ +.wp-block-activitypub-posts-and-replies .ap-tabs{border-bottom:1px solid;display:flex;gap:0;margin-bottom:1.5em}.wp-block-activitypub-posts-and-replies .ap-tabs__tab{background:none;border:none;border-bottom:2px solid transparent;color:inherit;cursor:pointer;font-family:inherit;font-size:inherit;margin-bottom:-1px;opacity:.6;padding:.5em 1em;text-decoration:none;transition:opacity .2s,border-color .2s}.wp-block-activitypub-posts-and-replies .ap-tabs__tab:focus-visible,.wp-block-activitypub-posts-and-replies .ap-tabs__tab:hover{opacity:1}.wp-block-activitypub-posts-and-replies .ap-tabs__tab.is-active{border-bottom-color:currentcolor;opacity:1} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index.css new file mode 100644 index 00000000..1b83fa7b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/posts-and-replies/style-index.css @@ -0,0 +1 @@ +.wp-block-activitypub-posts-and-replies .ap-tabs{border-bottom:1px solid;display:flex;gap:0;margin-bottom:1.5em}.wp-block-activitypub-posts-and-replies .ap-tabs__tab{background:none;border:none;border-bottom:2px solid transparent;color:inherit;cursor:pointer;font-family:inherit;font-size:inherit;margin-bottom:-1px;opacity:.6;padding:.5em 1em;text-decoration:none;transition:opacity .2s,border-color .2s}.wp-block-activitypub-posts-and-replies .ap-tabs__tab:focus-visible,.wp-block-activitypub-posts-and-replies .ap-tabs__tab:hover{opacity:1}.wp-block-activitypub-posts-and-replies .ap-tabs__tab.is-active{border-bottom-color:currentcolor;opacity:1} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/block.json b/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/block.json new file mode 100644 index 00000000..dd1d305d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/block.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "activitypub/pre-publish-panel", + "title": "ActivityPub Post Format Suggestions", + "category": "widgets", + "description": "Suggests optimal post formats for ActivityPub federation before publishing.", + "icon": "layout", + "textdomain": "activitypub", + "editorScript": "file:./plugin.js" +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.asset.php new file mode 100644 index 00000000..100a49bc --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.asset.php @@ -0,0 +1 @@ + array('react-jsx-runtime', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-dom', 'wp-editor', 'wp-element', 'wp-i18n', 'wp-plugins'), 'version' => '8bf8219b700555911ae5'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.js new file mode 100644 index 00000000..23ea2053 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/pre-publish-panel/plugin.js @@ -0,0 +1,3 @@ +(()=>{"use strict";const t=window.wp.editor,e=window.wp.blockEditor,o=window.wp.plugins,i=window.wp.components,n=window.wp.data,a=window.wp.element,s=window.wp.i18n,r=window.wp.dom,u=window._activityPubOptions?.noteLength||500,l=["youtube","vimeo","dailymotion","tiktok","videopress"],d=["spotify","soundcloud","mixcloud"],c=["core/paragraph","core/heading","core/list-item","core/preformatted","core/verse","core/pullquote"],p=["core/gallery","jetpack/tiled-gallery","jetpack/slideshow"],g={gallery:(0,s.__)("Gallery","activitypub"),video:(0,s.__)("Video","activitypub"),audio:(0,s.__)("Audio","activitypub"),image:(0,s.__)("Image","activitypub"),status:(0,s.__)("Status","activitypub")},m=(t,e)=>"core/pullquote"===t?e?.value||"":e?.content||"",h=t=>{const e={imageCount:0,galleryCount:0,videoCount:0,audioCount:0,textLength:0,textBlockCount:0};if(!t||!t.length)return e;for(const o of t){const{name:t,attributes:i,innerBlocks:n}=o;if("core/image"===t)e.imageCount++;else if(p.includes(t))e.galleryCount++;else if("core/video"===t)e.videoCount++;else if("core/audio"===t)e.audioCount++;else if("core/embed"===t){const t=(i?.providerNameSlug||"").toLowerCase();l.includes(t)?e.videoCount++:d.includes(t)&&e.audioCount++}if(c.includes(t)){const o=(0,r.__unstableStripHTML)(m(t,i));e.textLength+=o.length,e.textBlockCount++}if(n&&n.length){const t=h(n);e.imageCount+=t.imageCount,e.galleryCount+=t.galleryCount,e.videoCount+=t.videoCount,e.audioCount+=t.audioCount,e.textLength+=t.textLength,e.textBlockCount+=t.textBlockCount}}return e},v=window.ReactJSXRuntime;(0,o.registerPlugin)("activitypub-pre-publish",{render:()=>{const{blocks:o,postFormat:r}=(0,n.useSelect)(o=>({blocks:o(e.store).getBlocks(),postFormat:o(t.store).getEditedPostAttribute("format")}),[]),{editPost:l}=(0,n.useDispatch)(t.store),d=(0,a.useMemo)(()=>((t,e)=>{if(e&&"standard"!==e)return null;const o=h(t),i=o.imageCount>0||o.galleryCount>0||o.videoCount>0||o.audioCount>0;return(o.galleryCount>0||o.imageCount>1)&&o.textLength0&&o.textLength0&&o.textLength0&&o.textLength<280&&o.textBlockCount<=3?{format:"status",message:(0,s.__)("This is a short post with no media. Changing the format to Status won't change your post content, but will share it as a Note on the Fediverse, which is the standard format on platforms like Mastodon.","activitypub")}:null})(o,r),[o,r]);if("wordpress-post-format"!==window._activityPubOptions?.objectType)return null;if(!d){if(r&&"standard"!==r&&g[r]){const e=g[r]||r;return(0,v.jsx)(t.PluginPrePublishPanel,{title:(0,s.__)("Fediverse ⁂","activitypub"),initialOpen:!0,children:(0,v.jsx)("p",{children:(0,s.sprintf)(/* translators: %s: The current post format name (e.g., "Image", "Gallery", "Video"). */ /* translators: %s: The current post format name (e.g., "Image", "Gallery", "Video"). */ +(0,s.__)("This post will be shared in %s format on the Fediverse.","activitypub"),e)})})}return null}return(0,v.jsxs)(t.PluginPrePublishPanel,{title:(0,s.__)("Fediverse ⁂","activitypub"),initialOpen:!0,children:[(0,v.jsx)("p",{children:d.message}),(0,v.jsx)(i.Button,{variant:"secondary",onClick:()=>l({format:d.format}),children:(0,s.sprintf)(/* translators: %s: The suggested post format name (e.g., "Image", "Gallery", "Video"). */ /* translators: %s: The suggested post format name (e.g., "Image", "Gallery", "Video"). */ +(0,s.__)("Set format to %s","activitypub"),g[d.format]||d.format)})]})}})})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/block.json b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/block.json new file mode 100644 index 00000000..9b86041d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/block.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "name": "activitypub/reactions", + "apiVersion": 3, + "version": "8.3.0", + "title": "Fediverse Reactions", + "category": "widgets", + "icon": "heart", + "keywords": [ + "fediverse", + "activitypub", + "likes", + "reposts" + ], + "description": "Display Fediverse likes and reposts for your posts.", + "example": { + "attributes": { + "className": "is-style-facepile" + } + }, + "styles": [ + { + "name": "facepile", + "label": "Facepile", + "isDefault": true + }, + { + "name": "compact", + "label": "Compact" + } + ], + "attributes": { + "displayStyle": { + "type": "string", + "default": "facepile" + }, + "showActions": { + "type": "boolean", + "default": false + } + }, + "supports": { + "align": [ + "wide", + "full" + ], + "color": { + "gradients": true + }, + "__experimentalBorder": { + "radius": true, + "width": true, + "color": true, + "style": true + }, + "html": false, + "interactivity": true, + "shadow": true, + "typography": { + "fontSize": true, + "__experimentalDefaultControls": { + "fontSize": true + } + } + }, + "blockHooks": { + "core/post-content": "after" + }, + "textdomain": "activitypub", + "editorScript": "file:./index.js", + "style": "file:./style-index.css", + "viewStyle": "file:./view.css", + "viewScriptModule": "file:./view.js", + "viewScript": "wp-api-fetch", + "render": "file:./render.php" +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.asset.php new file mode 100644 index 00000000..17b7abd7 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.asset.php @@ -0,0 +1 @@ + array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '1e13568c338d5be171c1'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.js new file mode 100644 index 00000000..19b80e02 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/index.js @@ -0,0 +1,4 @@ +(()=>{"use strict";var e,t={2091(e,t,s){const i=window.wp.blocks,r=window.wp.blockEditor,a=window.ReactJSXRuntime,n=[{attributes:{},supports:{html:!1,align:!0,layout:{default:{type:"constrained",orientation:"vertical",justifyContent:"center"}}},save:()=>(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.InnerBlocks.Content,{}),(0,a.jsx)("div",{className:"activitypub-reactions-block"})]})},{attributes:{title:{type:"string",default:"Fediverse reactions"}},supports:{html:!1,align:!0,layout:{default:{type:"constrained",orientation:"vertical",justifyContent:"center"}}},save:()=>null,isEligible:({title:e})=>!!e,migrate:({title:e,...t})=>[t,[(0,i.createBlock)("core/heading",{content:e,level:6})]]}];function o(e){var t,s,i="";if("string"==typeof e||"number"==typeof e)i+=e;else if("object"==typeof e)if(Array.isArray(e)){var r=e.length;for(t=0;t{const{defaultAvatarUrl:s}=y();return"compact"===t?null:(0,a.jsx)("ul",{className:"reaction-avatars",children:e.map((e,t)=>{const i=["reaction-avatar"].filter(Boolean).join(" "),r=e.avatar||s;return(0,a.jsx)("li",{children:(0,a.jsx)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",children:(0,a.jsx)("img",{src:r,alt:e.name,className:i,width:"32",height:"32",onError:e=>{e.target.src=s}})})},t)})})},b=({reactions:e,displayStyle:t})=>{const{defaultAvatarUrl:s}=y();return(0,a.jsx)("ul",{className:"reactions-list",children:e.map((e,i)=>{const r=e.avatar||s;return(0,a.jsx)("li",{className:"reaction-item",children:(0,a.jsxs)("a",{href:e.url,className:"reaction-item",target:"_blank",rel:"noopener noreferrer",children:["facepile"===t&&(0,a.jsx)("img",{src:r,alt:e.name,width:"32",height:"32",onError:e=>{e.target.src=s}}),(0,a.jsx)("span",{className:"reaction-name",children:e.name})]})},i)})})},w=({items:e,label:t,displayStyle:s,showActions:i,actionLabel:r})=>{const[n,o]=(0,d.useState)(!1),[l,p]=(0,d.useState)(null),u=(0,d.useRef)(null),f=e.slice(0,20);return(0,a.jsxs)("div",{className:"reaction-group",ref:u,children:[i&&r&&(0,a.jsx)("button",{className:"reaction-action-button wp-element-button",type:"button",disabled:!0,children:r}),(0,a.jsx)(h,{reactions:f,displayStyle:s}),(0,a.jsx)(c.Button,{ref:p,className:"reaction-label is-link",onClick:()=>o(!n),"aria-expanded":n,children:t}),n&&l&&(0,a.jsx)(c.Popover,{anchor:l,onClose:()=>o(!1),className:"activitypub-popover",children:(0,a.jsx)(b,{reactions:e,displayStyle:s})})]})};function g({postId:e=null,reactions:t=null,fallbackReactions:s=null,displayStyle:i="facepile",showActions:r=!1}){const{namespace:n}=y(),[o,l]=(0,d.useState)(t),[c,p]=(0,d.useState)(!t),u=(0,d.useCallback)(()=>{s&&l(s),p(!1)},[s]);return(0,d.useEffect)(()=>{if(t)return l(t),void p(!1);e&&"number"==typeof e?(p(!0),v()({path:`/${n}/posts/${e}/reactions`}).then(e=>{const t=Object.values(e).some(e=>e.items?.length>0);l(!t&&s?s:e),p(!1)}).catch(u)):u()},[e,t,s,n,u]),c?null:o&&Object.values(o).some(e=>e.items?.length>0)?(0,a.jsx)("div",{className:"activitypub-reactions",children:Object.entries(o).map(([e,t])=>t.items?.length?(0,a.jsx)(w,{items:t.items,label:t.label,displayStyle:i,showActions:r,actionLabel:m[e]},e):null)}):null}const x=(e,t,s,i)=>Array.from({length:e},(e,r)=>({name:`${t} ${r+1}`,url:"#",avatar:`data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Ccircle cx='32' cy='32' r='32' fill='%23${i[r%i.length]}'/%3E%3Ctext x='32' y='38' font-family='sans-serif' font-size='24' fill='white' text-anchor='middle'%3E${String.fromCharCode(s+r)}%3C/text%3E%3C/svg%3E`})),j=["FF6B6B","4ECDC4","45B7D1","96CEB4","D4A5A5","9B59B6","3498DB","E67E22"],k={likes:{label:(0,p.sprintf)(/* translators: %d: Number of likes */ /* translators: %d: Number of likes */ +(0,p._x)("%d likes","number of likes","activitypub"),9),items:x(9,"User",65,j)},reposts:{label:(0,p.sprintf)(/* translators: %d: Number of reposts */ /* translators: %d: Number of reposts */ +(0,p._x)("%d reposts","number of reposts","activitypub"),6),items:x(6,"Reposter",82,j)},quotes:{label:(0,p.sprintf)(/* translators: %d: Number of quotes */ /* translators: %d: Number of quotes */ +(0,p._x)("%d quotes","number of quotes","activitypub"),7),items:x(7,"Quoter",81,j)}},_=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","name":"activitypub/reactions","apiVersion":3,"version":"8.2.1","title":"Fediverse Reactions","category":"widgets","icon":"heart","keywords":["fediverse","activitypub","likes","reposts"],"description":"Display Fediverse likes and reposts for your posts.","example":{"attributes":{"className":"is-style-facepile"}},"styles":[{"name":"facepile","label":"Facepile","isDefault":true},{"name":"compact","label":"Compact"}],"attributes":{"displayStyle":{"type":"string","default":"facepile"},"showActions":{"type":"boolean","default":false}},"supports":{"align":["wide","full"],"color":{"gradients":true},"__experimentalBorder":{"radius":true,"width":true,"color":true,"style":true},"html":false,"interactivity":true,"shadow":true,"typography":{"fontSize":true,"__experimentalDefaultControls":{"fontSize":true}}},"blockHooks":{"core/post-content":"after"},"textdomain":"activitypub","editorScript":"file:./index.js","style":"file:./style-index.css","viewStyle":"file:./view.css","viewScriptModule":"file:./view.js","viewScript":"wp-api-fetch","render":"file:./render.php"}');(0,i.registerBlockType)(_,{deprecated:n,edit:function({attributes:e,setAttributes:t}){const{className:s="",displayStyle:i="facepile",showActions:n=!1}=e,o=(0,r.useBlockProps)(),{getCurrentPostId:f}=(0,u.select)("core/editor"),{showAvatars:v=!0}=y(),m=(0,d.useRef)(!1);(0,d.useEffect)(()=>{if(m.current)return;m.current=!0;const e=s?.includes("is-style-");if(!e){const e=v?"facepile":"compact";t({className:l(s,`is-style-${e}`),displayStyle:e})}},[s,v,t]);const h=s?.includes("is-style-compact")?"compact":"facepile";(0,d.useEffect)(()=>{h!==i&&t({displayStyle:h})},[h,i,t]);const b=[["core/heading",{level:6,placeholder:(0,p.__)("Fediverse Reactions","activitypub"),content:(0,p.__)("Fediverse Reactions","activitypub")}]];return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.InspectorControls,{children:(0,a.jsx)(c.PanelBody,{title:(0,p.__)("Action Buttons","activitypub"),children:(0,a.jsx)(c.ToggleControl,{__nextHasNoMarginBottom:!0,label:(0,p.__)("Show action buttons","activitypub"),help:(0,p.__)("Display Like and Boost buttons so visitors can interact from their Fediverse server.","activitypub"),checked:n,onChange:e=>t({showActions:e})})})}),(0,a.jsxs)("div",{...o,children:[(0,a.jsx)(r.InnerBlocks,{template:b,allowedBlocks:["core/heading"],templateLock:"all",renderAppender:!1}),(0,a.jsx)(g,{postId:f(),fallbackReactions:k,displayStyle:i,showActions:n})]})]})},save:function(){return(0,a.jsx)("div",{...r.useBlockProps.save(),children:(0,a.jsx)(r.InnerBlocks.Content,{})})}})}},s={};function i(e){var r=s[e];if(void 0!==r)return r.exports;var a=s[e]={exports:{}};return t[e](a,a.exports,i),a.exports}i.m=t,e=[],i.O=(t,s,r,a)=>{if(!s){var n=1/0;for(p=0;p=a)&&Object.keys(i.O).every(e=>i.O[e](s[l]))?s.splice(l--,1):(o=!1,a0&&e[p-1][2]>a;p--)e[p]=e[p-1];e[p]=[s,r,a]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var s in t)i.o(t,s)&&!i.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={608:0,104:0};i.O.j=t=>0===e[t];var t=(t,s)=>{var r,a,[n,o,l]=s,c=0;if(n.some(t=>0!==e[t])){for(r in o)i.o(o,r)&&(i.m[r]=o[r]);if(l)var p=l(i)}for(t&&t(s);ci(2091));r=i.O(r)})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/render.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/render.php new file mode 100644 index 00000000..68b7fb26 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/render.php @@ -0,0 +1,418 @@ + null, + 'displayStyle' => $default_display_style, + 'showActions' => false, + ) +); + +/* @var \WP_Block $block Current block. */ +$block = $block ?? ''; + +/* @var string $content Block content. */ +$content = $content ?? ''; + +if ( empty( $content ) ) { + // Fallback for v1.0.0 blocks. + $_title = $attributes['title'] ?? __( 'Fediverse Reactions', 'activitypub' ); + $content = '
' . esc_html( $_title ) . '
'; + unset( $attributes['title'] ); +} else { + $content = implode( PHP_EOL, wp_list_pluck( $block->parsed_block['innerBlocks'], 'innerHTML' ) ); + // Hide empty headings. + if ( empty( wp_strip_all_tags( $content ) ) ) { + $content = ''; + } +} + +// Get the Post ID from attributes or use the current post. +$_post_id = $attributes['postId'] ?? get_the_ID(); + +// Don't leak reaction metadata for posts that are not currently publicly queryable. +if ( ! is_post_publicly_queryable( $_post_id ) ) { + return; +} + +// Generate a unique ID for the block. +$block_id = 'activitypub-reactions-block-' . wp_unique_id(); + +/* + * Determine display style - compact style hides avatars. + * For auto-hooked blocks without explicit style, use avatar setting to determine style. + */ +$has_style_class = isset( $attributes['className'] ) && strpos( $attributes['className'], 'is-style-' ) !== false; +if ( ! $has_style_class ) { + $attributes['className'] = trim( ( $attributes['className'] ?? '' ) . ' is-style-' . $default_display_style ); + $attributes['displayStyle'] = $default_display_style; +} + +$show_avatars = 'facepile' === $attributes['displayStyle']; + +// Fetch reactions. +$reactions = array(); + +foreach ( Comment::get_comment_types() as $_type => $type_object ) { + $_comments = get_comments( + array( + 'post_id' => $_post_id, + 'type' => $_type, + 'status' => 'approve', + 'parent' => 0, + ) + ); + + if ( empty( $_comments ) ) { + continue; + } + + $count = count( $_comments ); + // phpcs:disable WordPress.WP.I18n + $label = sprintf( + _n( + $type_object['count_single'], + $type_object['count_plural'], + $count, + 'activitypub' + ), + number_format_i18n( $count ) + ); + // phpcs:enable WordPress.WP.I18n + + $reactions[ $_type ] = array( + 'label' => $label, + 'count' => $count, + 'items' => array_map( + static function ( $comment ) { + return array( + 'name' => html_entity_decode( $comment->comment_author ), + 'url' => $comment->comment_author_url, + 'avatar' => get_avatar_url( $comment ), + ); + }, + $_comments + ), + ); +} + +if ( empty( $reactions ) && ! $attributes['showActions'] ) { + echo ''; + return; +} + +// Set up the Interactivity API config. +$config = array( + 'defaultAvatarUrl' => ACTIVITYPUB_PLUGIN_URL . 'assets/img/mp.jpg', + 'namespace' => ACTIVITYPUB_REST_NAMESPACE, +); + +if ( $attributes['showActions'] ) { + $config['i18n'] = array( + 'copied' => __( 'Copied!', 'activitypub' ), + 'copy' => __( 'Copy', 'activitypub' ), + 'emptyProfileError' => __( 'Please enter a profile URL or handle.', 'activitypub' ), + 'genericError' => __( 'An error occurred. Please try again.', 'activitypub' ), + 'intentLabelLike' => __( 'Like this post', 'activitypub' ), + 'intentLabelAnnounce' => __( 'Boost this post', 'activitypub' ), + 'invalidProfileError' => __( 'Please enter a valid profile URL or handle.', 'activitypub' ), + ); +} + +wp_interactivity_config( 'activitypub/reactions', $config ); + +// Set up the Interactivity API state. +wp_interactivity_state( 'activitypub/reactions', array( 'reactions' => array( $_post_id => $reactions ) ) ); + +// Render a subset of the most recent reactions for facepile. +$reactions = array_map( + static function ( $reaction ) use ( $attributes ) { + $count = 20; + if ( 'wide' === $attributes['align'] ) { + $count = 40; + } elseif ( 'full' === $attributes['align'] ) { + $count = 60; + } + + $reaction['items'] = array_slice( array_reverse( $reaction['items'] ), 0, $count ); + + return $reaction; + }, + $reactions +); + +// Initialize the context for the block. +$context = array( + 'blockId' => $block_id, + 'modal' => array( + 'isCompact' => true, + 'isOpen' => false, + 'items' => array(), + 'title' => '', + ), + 'postId' => $_post_id, + 'reactions' => $reactions, +); + +if ( $attributes['showActions'] ) { + $context['modal']['intent'] = ''; + $context['copyButtonText'] = __( 'Copy', 'activitypub' ); + $context['errorMessage'] = ''; + $context['isError'] = false; + $context['isLoading'] = false; + $context['postUrl'] = get_post_id( $_post_id ); + $context['remoteProfile'] = ''; + $context['shouldSaveProfile'] = true; +} + +// Map comment types to remote intent types. +$intent_map = array( + 'like' => 'like', + 'repost' => 'announce', + 'quote' => 'announce', +); + +// Build reactions content. +ob_start(); +?> +
+ $reaction ) : + /* translators: %s: reaction type. */ + $aria_label = sprintf( __( 'View all %s', 'activitypub' ), Comment::get_comment_type_attr( $_type, 'label' ) ); + $intent = isset( $intent_map[ $_type ] ) ? $intent_map[ $_type ] : ''; + ?> +
+ + + + +
    + +
+ + +
+ + +
+ $intent ) : ?> + + +
+ +
+ +
+
    + +
+
+ +
+
+

+
+ +
+
+ + + +
+
+
+

+
+ + +
+
+ + + +
+
+
+ +
+
+
+ + $modal_content, +); + +if ( $attributes['showActions'] ) { + $modal_args['title_binding'] = 'context.modal.title'; +} else { + $modal_args['is_compact'] = true; +} + +ob_start(); +Blocks::render_modal( $modal_args ); +$inner_content = $reactions_content . ob_get_clean(); + +$wrapper_attrs = array( + 'id' => $block_id, + 'class' => $attributes['className'] ?? '', + 'data-wp-interactive' => 'activitypub/reactions', + 'data-wp-context' => wp_json_encode( $context, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ), + 'data-wp-init' => 'callbacks.initReactions', +); + +$wrapper_attributes = get_block_wrapper_attributes( $wrapper_attrs ); + +// Render the block with common wrapper. +?> +
> + + +
diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index-rtl.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index-rtl.css new file mode 100644 index 00000000..f08cdc13 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index-rtl.css @@ -0,0 +1 @@ +body.modal-open{overflow:hidden}.activitypub-modal__overlay{--activitypub-modal-background-color:var(--wp--preset--color--base,var(--wp--preset--color--background,#fff));--activitypub-modal-border-color:var(--wp--preset--color--contrast-3,var(--wp--preset--color--light-gray,#e2e4e7));--activitypub-modal-radius:var(--wp--custom--border--radius--medium,8px);--activitypub-modal-shadow:var(--wp--preset--shadow--natural,0 5px 15px rgba(0,0,0,.3));--activitypub-modal-compact-shadow:var(--wp--preset--shadow--natural,0 2px 8px rgba(0,0,0,.1));--activitypub-modal-text-color:var(--wp--preset--color--contrast,var(--wp--preset--color--foreground,inherit));align-items:center;background-color:rgba(0,0,0,.5);bottom:0;color:var(--activitypub-modal-text-color);display:flex;justify-content:center;right:0;margin:0!important;max-width:none!important;padding:1rem;position:fixed;left:0;top:0;z-index:100000}.activitypub-modal__overlay.compact{align-items:flex-start;background-color:transparent;bottom:auto;justify-content:flex-start;right:auto;padding:0;position:absolute;left:auto;top:auto;z-index:100}.activitypub-modal__overlay[hidden]{display:none}.activitypub-modal__frame{animation:activitypub-modal-appear .2s ease-out;background-color:var(--activitypub-modal-background-color);border:1px solid var(--activitypub-modal-border-color);border-radius:var(--activitypub-modal-radius);box-shadow:var(--activitypub-modal-shadow);box-sizing:border-box;color:var(--wp--preset--color--contrast,#1e1e1e);display:flex;flex-direction:column;font-size:inherit;max-height:calc(100vh - 2rem);max-width:660px;overflow:hidden;width:100%}.compact .activitypub-modal__frame{box-shadow:var(--activitypub-modal-compact-shadow);max-height:300px;max-width:-moz-min-content;max-width:min-content;min-width:250px;width:auto}.activitypub-modal__header{align-items:center;border-bottom:1px solid var(--activitypub-modal-border-color);display:flex;flex-shrink:0;justify-content:space-between;padding:2rem 2rem 1.5rem}.compact .activitypub-modal__header{display:none}.activitypub-modal__header .activitypub-modal__close{align-items:center;background:transparent;border:none;border-radius:var(--activitypub-modal-radius);color:inherit;cursor:pointer;display:flex;justify-content:center;padding:.5rem;width:auto}.activitypub-modal__header .activitypub-modal__close:active{border:none;padding:.5rem}.activitypub-modal__title{font-size:130%;font-weight:600;line-height:1.4;margin:0!important}.activitypub-modal__content{overflow-y:auto}.activitypub-dialog__section{border-bottom:1px solid var(--activitypub-modal-border-color,var(--wp--preset--color--light-gray,#f0f0f0));padding:1.5rem 2rem}.activitypub-dialog__section:last-child{border-bottom:none;padding-bottom:2rem}.activitypub-dialog__section h4{font-size:110%;margin-bottom:.5rem;margin-top:0}.activitypub-dialog__description{color:inherit;margin-bottom:1rem}.activitypub-dialog__button-group{align-items:center;display:flex;gap:.5rem;margin-bottom:.5rem;width:100%}.activitypub-dialog__button-group input[type]{background-color:var(--activitypub-modal-background-color,#fff)!important;border:1px solid var(--activitypub-modal-border-color,#949494)!important;border-radius:0;box-sizing:border-box;color:inherit!important;flex:1;font-family:inherit;font-size:1em;line-height:1;margin:0;min-width:0;padding:calc(.667em + 2px)!important}.activitypub-dialog__button-group input[type]::-moz-placeholder{opacity:.5}.activitypub-dialog__button-group input[type]::placeholder{opacity:.5}.activitypub-dialog__button-group input[type][aria-invalid=true]{border-color:var(--wp--preset--color--vivid-red,#b32d2e)!important}.activitypub-dialog__button-group button{background-color:var(--wp--preset--color--contrast,#1e1e1e);border:none;box-sizing:border-box;color:var(--wp--preset--color--base,#fff);cursor:pointer;font-family:inherit;font-size:1em;line-height:1;min-width:22.5%;padding:calc(.667em + 2px) 1.5em;width:auto}.activitypub-dialog__error{color:var(--wp--preset--color--vivid-red,#b32d2e);font-size:90%;margin-top:.5rem}.activitypub-dialog__remember{font-size:90%;margin-top:1rem}.activitypub-dialog__remember label{align-items:center;display:flex;gap:.5rem}.activitypub-dialog__remember input[type=checkbox]{margin:0;position:relative;top:0}@keyframes activitypub-modal-appear{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.wp-block-activitypub-reactions{box-sizing:border-box;margin:2rem auto;max-width:var(--wp--style--global--content-size);position:relative}.wp-block-activitypub-reactions.alignwide{max-width:var(--wp--style--global--wide-size)}.wp-block-activitypub-reactions.alignfull{max-width:none}.wp-block-activitypub-reactions.has-background,.wp-block-activitypub-reactions.has-border{padding:2rem}.wp-block-activitypub-reactions .activitypub-reactions{display:flex;flex-direction:column;flex-wrap:wrap}.wp-block-activitypub-reactions .reaction-group{align-items:center;display:flex;gap:.75rem;justify-content:flex-start;margin:.5em 0;position:relative;width:100%}.wp-block-activitypub-reactions .reaction-group .reaction-avatars{align-items:center;display:flex;flex-direction:row;list-style:none;margin:0!important;padding:0}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li{margin:0 0 0 -10px;padding:0;transition:transform .2s ease}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li:not([hidden]):not(:has(~li:not([hidden]))){margin-left:0}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li:hover{transform:translateY(-2px);z-index:2}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li a{border-radius:50%;box-shadow:none;display:block;line-height:1;text-decoration:none}.wp-block-activitypub-reactions .reaction-group .reaction-avatar{max-height:32px;max-width:32px;overflow:hidden;-moz-force-broken-image-icon:1;border:.5px solid var(--wp--preset--color--contrast,hsla(0,0%,100%,.8));border-radius:50%;box-shadow:0 0 0 .5px hsla(0,0%,100%,.8),0 1px 3px rgba(0,0,0,.2);transition:transform .6s cubic-bezier(.34,1.56,.64,1);will-change:transform}.wp-block-activitypub-reactions .reaction-group .reaction-avatar:focus-visible,.wp-block-activitypub-reactions .reaction-group .reaction-avatar:hover{position:relative;transform:translateY(-5px);z-index:1}.wp-block-activitypub-reactions .reaction-group .reaction-label{align-items:center;background:none;border:none;color:currentcolor;cursor:pointer;display:flex;flex:0 0 auto;font:inherit;font-size:var(--wp--preset--font-size--small,.875rem);gap:.25rem;padding:.25rem 0;text-decoration:none;white-space:nowrap}.wp-block-activitypub-reactions .reaction-group .reaction-label:hover{color:currentcolor;text-decoration:underline}.wp-block-activitypub-reactions .reaction-group .reaction-label:focus{box-shadow:none;outline:none}.wp-block-activitypub-reactions .reaction-group .reaction-label:focus-visible{outline:1px solid currentcolor;outline-offset:2px}.wp-block-activitypub-reactions .reaction-actions-only{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem;margin:.5em 0}.wp-block-activitypub-reactions .reaction-action-button{background:none;border:1px solid;border-radius:4px;color:currentcolor;cursor:pointer;flex:0 0 auto;font-size:var(--wp--preset--font-size--small,.875rem);min-width:5.5em;padding:.25rem .75rem;text-align:center;text-decoration:none;transition:background-color .2s ease;white-space:nowrap}.wp-block-activitypub-reactions .reaction-action-button:hover{background-color:rgba(0,0,0,.05);color:currentcolor}.wp-block-activitypub-reactions .reaction-action-button:focus:not(:disabled){box-shadow:none;outline:1px solid currentcolor;outline-offset:2px}.reactions-list{list-style:none;margin:0!important;padding:.5rem}.components-popover__content>.reactions-list{padding:0}.reactions-list .reaction-item{margin:0 0 .5rem}.reactions-list .reaction-item:last-child{margin-bottom:0}.reactions-list .reaction-item a{align-items:center;border-radius:4px;box-shadow:none;color:inherit;display:flex;gap:.75rem;padding:.5rem;text-decoration:none;transition:background-color .2s ease}.reactions-list .reaction-item a:hover{background-color:rgba(0,0,0,.03)}.reactions-list .reaction-item img{border:1px solid var(--wp--preset--color--light-gray,#f0f0f0);border-radius:50%;box-shadow:none;height:36px;width:36px}.reactions-list .reaction-item .reaction-name{font-size:var(--wp--preset--font-size--small,.875rem)}.activitypub-popover .components-popover__content{box-shadow:0 2px 8px rgba(0,0,0,.1);max-height:300px;max-width:-moz-min-content;max-width:min-content;min-width:250px;padding:.5rem;width:auto}.wp-block-activitypub-reactions.is-style-compact .wp-block-heading{margin-bottom:.5em}.wp-block-activitypub-reactions.is-style-compact .activitypub-reactions{display:inline-flex;flex-direction:row;flex-wrap:wrap;gap:.5em}.wp-block-activitypub-reactions.is-style-compact .reaction-group{display:inline-flex;margin:0;width:auto}.wp-block-activitypub-reactions.is-style-compact .reaction-actions-only{display:inline-flex;margin:0} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index.css new file mode 100644 index 00000000..1ff699cd --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/style-index.css @@ -0,0 +1 @@ +body.modal-open{overflow:hidden}.activitypub-modal__overlay{--activitypub-modal-background-color:var(--wp--preset--color--base,var(--wp--preset--color--background,#fff));--activitypub-modal-border-color:var(--wp--preset--color--contrast-3,var(--wp--preset--color--light-gray,#e2e4e7));--activitypub-modal-radius:var(--wp--custom--border--radius--medium,8px);--activitypub-modal-shadow:var(--wp--preset--shadow--natural,0 5px 15px rgba(0,0,0,.3));--activitypub-modal-compact-shadow:var(--wp--preset--shadow--natural,0 2px 8px rgba(0,0,0,.1));--activitypub-modal-text-color:var(--wp--preset--color--contrast,var(--wp--preset--color--foreground,inherit));align-items:center;background-color:rgba(0,0,0,.5);bottom:0;color:var(--activitypub-modal-text-color);display:flex;justify-content:center;left:0;margin:0!important;max-width:none!important;padding:1rem;position:fixed;right:0;top:0;z-index:100000}.activitypub-modal__overlay.compact{align-items:flex-start;background-color:transparent;bottom:auto;justify-content:flex-start;left:auto;padding:0;position:absolute;right:auto;top:auto;z-index:100}.activitypub-modal__overlay[hidden]{display:none}.activitypub-modal__frame{animation:activitypub-modal-appear .2s ease-out;background-color:var(--activitypub-modal-background-color);border:1px solid var(--activitypub-modal-border-color);border-radius:var(--activitypub-modal-radius);box-shadow:var(--activitypub-modal-shadow);box-sizing:border-box;color:var(--wp--preset--color--contrast,#1e1e1e);display:flex;flex-direction:column;font-size:inherit;max-height:calc(100vh - 2rem);max-width:660px;overflow:hidden;width:100%}.compact .activitypub-modal__frame{box-shadow:var(--activitypub-modal-compact-shadow);max-height:300px;max-width:-moz-min-content;max-width:min-content;min-width:250px;width:auto}.activitypub-modal__header{align-items:center;border-bottom:1px solid var(--activitypub-modal-border-color);display:flex;flex-shrink:0;justify-content:space-between;padding:2rem 2rem 1.5rem}.compact .activitypub-modal__header{display:none}.activitypub-modal__header .activitypub-modal__close{align-items:center;background:transparent;border:none;border-radius:var(--activitypub-modal-radius);color:inherit;cursor:pointer;display:flex;justify-content:center;padding:.5rem;width:auto}.activitypub-modal__header .activitypub-modal__close:active{border:none;padding:.5rem}.activitypub-modal__title{font-size:130%;font-weight:600;line-height:1.4;margin:0!important}.activitypub-modal__content{overflow-y:auto}.activitypub-dialog__section{border-bottom:1px solid var(--activitypub-modal-border-color,var(--wp--preset--color--light-gray,#f0f0f0));padding:1.5rem 2rem}.activitypub-dialog__section:last-child{border-bottom:none;padding-bottom:2rem}.activitypub-dialog__section h4{font-size:110%;margin-bottom:.5rem;margin-top:0}.activitypub-dialog__description{color:inherit;margin-bottom:1rem}.activitypub-dialog__button-group{align-items:center;display:flex;gap:.5rem;margin-bottom:.5rem;width:100%}.activitypub-dialog__button-group input[type]{background-color:var(--activitypub-modal-background-color,#fff)!important;border:1px solid var(--activitypub-modal-border-color,#949494)!important;border-radius:0;box-sizing:border-box;color:inherit!important;flex:1;font-family:inherit;font-size:1em;line-height:1;margin:0;min-width:0;padding:calc(.667em + 2px)!important}.activitypub-dialog__button-group input[type]::-moz-placeholder{opacity:.5}.activitypub-dialog__button-group input[type]::placeholder{opacity:.5}.activitypub-dialog__button-group input[type][aria-invalid=true]{border-color:var(--wp--preset--color--vivid-red,#b32d2e)!important}.activitypub-dialog__button-group button{background-color:var(--wp--preset--color--contrast,#1e1e1e);border:none;box-sizing:border-box;color:var(--wp--preset--color--base,#fff);cursor:pointer;font-family:inherit;font-size:1em;line-height:1;min-width:22.5%;padding:calc(.667em + 2px) 1.5em;width:auto}.activitypub-dialog__error{color:var(--wp--preset--color--vivid-red,#b32d2e);font-size:90%;margin-top:.5rem}.activitypub-dialog__remember{font-size:90%;margin-top:1rem}.activitypub-dialog__remember label{align-items:center;display:flex;gap:.5rem}.activitypub-dialog__remember input[type=checkbox]{margin:0;position:relative;top:0}@keyframes activitypub-modal-appear{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.wp-block-activitypub-reactions{box-sizing:border-box;margin:2rem auto;max-width:var(--wp--style--global--content-size);position:relative}.wp-block-activitypub-reactions.alignwide{max-width:var(--wp--style--global--wide-size)}.wp-block-activitypub-reactions.alignfull{max-width:none}.wp-block-activitypub-reactions.has-background,.wp-block-activitypub-reactions.has-border{padding:2rem}.wp-block-activitypub-reactions .activitypub-reactions{display:flex;flex-direction:column;flex-wrap:wrap}.wp-block-activitypub-reactions .reaction-group{align-items:center;display:flex;gap:.75rem;justify-content:flex-start;margin:.5em 0;position:relative;width:100%}.wp-block-activitypub-reactions .reaction-group .reaction-avatars{align-items:center;display:flex;flex-direction:row;list-style:none;margin:0!important;padding:0}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li{margin:0 -10px 0 0;padding:0;transition:transform .2s ease}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li:not([hidden]):not(:has(~li:not([hidden]))){margin-right:0}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li:hover{transform:translateY(-2px);z-index:2}.wp-block-activitypub-reactions .reaction-group .reaction-avatars li a{border-radius:50%;box-shadow:none;display:block;line-height:1;text-decoration:none}.wp-block-activitypub-reactions .reaction-group .reaction-avatar{max-height:32px;max-width:32px;overflow:hidden;-moz-force-broken-image-icon:1;border:.5px solid var(--wp--preset--color--contrast,hsla(0,0%,100%,.8));border-radius:50%;box-shadow:0 0 0 .5px hsla(0,0%,100%,.8),0 1px 3px rgba(0,0,0,.2);transition:transform .6s cubic-bezier(.34,1.56,.64,1);will-change:transform}.wp-block-activitypub-reactions .reaction-group .reaction-avatar:focus-visible,.wp-block-activitypub-reactions .reaction-group .reaction-avatar:hover{position:relative;transform:translateY(-5px);z-index:1}.wp-block-activitypub-reactions .reaction-group .reaction-label{align-items:center;background:none;border:none;color:currentcolor;cursor:pointer;display:flex;flex:0 0 auto;font:inherit;font-size:var(--wp--preset--font-size--small,.875rem);gap:.25rem;padding:.25rem 0;text-decoration:none;white-space:nowrap}.wp-block-activitypub-reactions .reaction-group .reaction-label:hover{color:currentcolor;text-decoration:underline}.wp-block-activitypub-reactions .reaction-group .reaction-label:focus{box-shadow:none;outline:none}.wp-block-activitypub-reactions .reaction-group .reaction-label:focus-visible{outline:1px solid currentcolor;outline-offset:2px}.wp-block-activitypub-reactions .reaction-actions-only{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem;margin:.5em 0}.wp-block-activitypub-reactions .reaction-action-button{background:none;border:1px solid;border-radius:4px;color:currentcolor;cursor:pointer;flex:0 0 auto;font-size:var(--wp--preset--font-size--small,.875rem);min-width:5.5em;padding:.25rem .75rem;text-align:center;text-decoration:none;transition:background-color .2s ease;white-space:nowrap}.wp-block-activitypub-reactions .reaction-action-button:hover{background-color:rgba(0,0,0,.05);color:currentcolor}.wp-block-activitypub-reactions .reaction-action-button:focus:not(:disabled){box-shadow:none;outline:1px solid currentcolor;outline-offset:2px}.reactions-list{list-style:none;margin:0!important;padding:.5rem}.components-popover__content>.reactions-list{padding:0}.reactions-list .reaction-item{margin:0 0 .5rem}.reactions-list .reaction-item:last-child{margin-bottom:0}.reactions-list .reaction-item a{align-items:center;border-radius:4px;box-shadow:none;color:inherit;display:flex;gap:.75rem;padding:.5rem;text-decoration:none;transition:background-color .2s ease}.reactions-list .reaction-item a:hover{background-color:rgba(0,0,0,.03)}.reactions-list .reaction-item img{border:1px solid var(--wp--preset--color--light-gray,#f0f0f0);border-radius:50%;box-shadow:none;height:36px;width:36px}.reactions-list .reaction-item .reaction-name{font-size:var(--wp--preset--font-size--small,.875rem)}.activitypub-popover .components-popover__content{box-shadow:0 2px 8px rgba(0,0,0,.1);max-height:300px;max-width:-moz-min-content;max-width:min-content;min-width:250px;padding:.5rem;width:auto}.wp-block-activitypub-reactions.is-style-compact .wp-block-heading{margin-bottom:.5em}.wp-block-activitypub-reactions.is-style-compact .activitypub-reactions{display:inline-flex;flex-direction:row;flex-wrap:wrap;gap:.5em}.wp-block-activitypub-reactions.is-style-compact .reaction-group{display:inline-flex;margin:0;width:auto}.wp-block-activitypub-reactions.is-style-compact .reaction-actions-only{display:inline-flex;margin:0} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.asset.php new file mode 100644 index 00000000..fe305c93 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.asset.php @@ -0,0 +1 @@ + array('@wordpress/interactivity'), 'version' => 'c92a83cbb3c92ac4f478', 'type' => 'module'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.css new file mode 100644 index 00000000..0cfa09f5 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.css @@ -0,0 +1 @@ +.wp-block-activitypub-reactions .activitypub-modal__overlay.compact .activitypub-modal__frame{max-width:100%;min-width:250px} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.js new file mode 100644 index 00000000..71c1fe17 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reactions/view.js @@ -0,0 +1 @@ +import*as t from"@wordpress/interactivity";const e=t,o=e.withSyncEvent??(t=>t);!function(){const{actions:t,callbacks:n}=(0,e.store)("activitypub/reactions",{actions:{openModal(t){const o=(0,e.getContext)();if(o.modal.isOpen=!0,o.modal.isCompact)setTimeout(n.positionModal,0);else{const t=document.getElementById(o.blockId);if(t){const e=t.querySelector(".activitypub-modal__overlay");e&&["top","left","right","bottom"].forEach(t=>{e.style.removeProperty(t)})}setTimeout(()=>{if(t){const e=t.querySelector(".activitypub-modal__frame");e&&n.trapFocus(e)}},50)}"function"==typeof n.onModalOpen&&n.onModalOpen(t)},closeModal(t){const o=(0,e.getContext)();o.modal.isOpen=!1;const r=(0,e.getElement)();if("actions.toggleModal"===r.ref.dataset["wpOn-Click"])r.ref.focus();else{const t=document.getElementById(o.blockId);if(t){const e=t.querySelector('[data-wp-on--click="actions.toggleModal"]');e&&e.focus()}}"function"==typeof n.onModalClose&&n.onModalClose(t)},toggleModal:o(o=>{o?.preventDefault?.();const{modal:n}=(0,e.getContext)();n.isOpen?t.closeModal(o):t.openModal(o)})},callbacks:{_abortController:null,handleModalEffects(){const{modal:t}=(0,e.getContext)();if(t.isOpen&&!t.isCompact?document.body.classList.add("modal-open"):document.body.classList.remove("modal-open"),n._abortController&&(n._abortController.abort(),n._abortController=null),t.isOpen){n._abortController=new AbortController;const{signal:t}=n._abortController;document.addEventListener("keydown",n.documentKeydown,{signal:t}),document.addEventListener("click",n.documentClick,{signal:t})}},documentKeydown(o){const{modal:n}=(0,e.getContext)();n.isOpen&&"Escape"===o.key&&t.closeModal()},documentClick(o){const{blockId:n,modal:r}=(0,e.getContext)();if(!r.isOpen)return;const a=document.getElementById(n);if(!a)return;const s=a.querySelectorAll('[data-wp-on--click="actions.toggleModal"]');for(const t of s)if(t===o.target||t.contains(o.target))return;const i=a.querySelector(".activitypub-modal__frame");i&&!i.contains(o.target)&&t.closeModal()},positionModal(){const{blockId:t}=(0,e.getContext)(),o=document.getElementById(t);if(!o)return;const n=o.querySelector(".activitypub-modal__overlay");if(!n)return;n.style.top="",n.style.left="",n.style.right="",n.style.bottom="";const r=(0,e.getElement)().ref.getBoundingClientRect(),a=window.innerWidth,s=o.getBoundingClientRect(),i={top:r.bottom-s.top+8+"px",left:r.left-s.left-2+"px"};a-r.right<250&&(i.left="auto",i.right=s.right-r.right+"px"),Object.assign(n.style,i)},trapFocus(t){const e=t.querySelectorAll('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]):not([readonly]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])'),o=e[0],n=e[e.length-1];o&&o.classList.contains("activitypub-modal__close")&&e.length>1?e[1].focus():o.focus(),t.addEventListener("keydown",function(e){if("Tab"!==e.key&&9!==e.keyCode)return;const r=t.ownerDocument.activeElement;e.shiftKey?r===o&&(n.focus(),e.preventDefault()):r===n&&(o.focus(),e.preventDefault())})}}})}();const n={like:"intentLabelLike",announce:"intentLabelAnnounce"},r="fediverse-remote-user",{actions:a,callbacks:s,state:i}=(0,e.store)("activitypub/reactions",{actions:{async fetchReactions(){const t=(0,e.getContext)();if(!t.postId)return;const{namespace:o}=(0,e.getConfig)(),{apiFetch:n}=window.wp;try{t.reactions=await n({path:`/${o}/posts/${t.postId}/reactions`})}catch(t){console.error("Error fetching reactions:",t)}},openIntentModal(){const t=(0,e.getContext)(),o=(0,e.getElement)().ref.dataset.intent;t.modal.isCompact=!1,t.modal.intent=o;const{i18n:r}=(0,e.getConfig)();t.modal.title=r[n[o]]||o;const{profileURL:i}=s.getStore();i&&(t.remoteProfile=i),a.openModal()},updateIntentProfile(t){const o=(0,e.getContext)();o.remoteProfile=t.target.value,o.isError=!1,o.errorMessage=""},onIntentKeydown(t){"Enter"===t.key&&(t.preventDefault(),a.submitIntent())},*submitIntent(){const t=(0,e.getContext)(),{namespace:o,i18n:n}=(0,e.getConfig)(),{apiFetch:r}=window.wp,i=t.remoteProfile.trim();if(!i)return t.isError=!0,void(t.errorMessage=n.emptyProfileError);if(!s.isHandle(i)&&!s.isUrl(i))return t.isError=!0,void(t.errorMessage=n.invalidProfileError);t.isLoading=!0,t.isError=!1,t.errorMessage="";const l=`/${o}/posts/${t.postId}/remote-intent?resource=${encodeURIComponent(i)}&intent=${encodeURIComponent(t.modal.intent)}`;try{const e=yield r({path:l});t.isLoading=!1,window.open(e.url,"_blank","noopener,noreferrer"),a.closeModal(),t.shouldSaveProfile&&s.setStore({profileURL:i})}catch(e){console.error("Error submitting intent:",e),t.isLoading=!1,t.isError=!0,t.errorMessage=e.message||n.genericError}},copyPostUrl(){const t=(0,e.getContext)(),{i18n:o}=(0,e.getConfig)();navigator.clipboard.writeText(t.postUrl).then(()=>{t.copyButtonText=o.copied,setTimeout(()=>{t.copyButtonText=o.copy},1e3)},t=>{console.error("Could not copy text: ",t)})},toggleRememberProfile(){const t=(0,e.getContext)();t.shouldSaveProfile=!t.shouldSaveProfile}},callbacks:{initReactions(){const t=new ResizeObserver((0,e.withScope)(s.calculateVisibleAvatars));return(0,e.getElement)().ref.querySelectorAll(".reaction-group").forEach(e=>{t.observe(e)}),()=>{t.disconnect()}},calculateVisibleAvatars(){const{postId:t}=(0,e.getContext)();(i.reactions&&i.reactions[t]?Object.keys(i.reactions[t]):[]).forEach(o=>{i.reactions?.[t][o]?.items?.length&&(0,e.getElement)().ref.querySelectorAll(`.reaction-group[data-reaction-type="${o}"]`).forEach(e=>{const n=e.querySelector(".reaction-label").offsetWidth||0,r=e.querySelector(".reaction-action-button"),a=r?r.offsetWidth+12:0,s=e.offsetWidth-n-a-12;let l=1;s>32&&(l+=Math.floor((s-32)/22));const c=i.reactions[t][o].items,d=Math.min(l,c.length),u=e.querySelector(".reaction-avatars");u&&u.querySelectorAll("li").forEach((t,e)=>{e ACTIVITYPUB_REST_NAMESPACE, + 'i18n' => array( + 'copied' => __( 'Copied!', 'activitypub' ), + 'copy' => __( 'Copy', 'activitypub' ), + 'emptyProfileError' => __( 'Please enter a profile URL or handle.', 'activitypub' ), + 'genericError' => __( 'An error occurred. Please try again.', 'activitypub' ), + 'invalidProfileError' => __( 'Please enter a valid profile URL or handle.', 'activitypub' ), + ), + ) +); + +// Add the block wrapper attributes. +$wrapper_attributes = get_block_wrapper_attributes( + array( + 'id' => $block_id, + 'class' => 'activitypub-remote-reply reply', + 'data-wp-interactive' => 'activitypub/remote-reply', + 'data-wp-init' => 'callbacks.init', + ) +); + +$wrapper_context = wp_interactivity_data_wp_context( + array( + 'blockId' => $block_id, + 'commentId' => $comment_id, + 'commentURL' => $selected_comment, + 'copyButtonText' => __( 'Copy', 'activitypub' ), + 'errorMessage' => '', + 'isError' => false, + 'isLoading' => false, + 'modal' => array( 'isOpen' => false ), + 'remoteProfile' => '', + 'shouldSaveProfile' => true, + ) +); + +wp_interactivity_state( + 'activitypub/remote-reply', + array( + 'hasRemoteUser' => false, + 'profileURL' => '', + 'template' => '', + ) +); + +ob_start(); +?> +
+

+
+ +
+
+ + + +
+
+
+

+
+ + +
+
+ + + +
+
+
+ +
+
+ +
+ +> + + + + + $block_id . '-modal', + 'title' => __( 'Remote Reply', 'activitypub' ), + 'content' => $modal_content, + ) + ); + ?> +
+ array('@wordpress/interactivity'), 'version' => '283e9946a5209ff839e1', 'type' => 'module'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/view.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/view.js new file mode 100644 index 00000000..60383afb --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/remote-reply/view.js @@ -0,0 +1 @@ +import*as e from"@wordpress/interactivity";var t,o,r={475(){const t=e,o=t.withSyncEvent??(e=>e);!function(){const{actions:e,callbacks:r}=(0,t.store)("activitypub/remote-reply",{actions:{openModal(e){const o=(0,t.getContext)();if(o.modal.isOpen=!0,o.modal.isCompact)setTimeout(r.positionModal,0);else{const e=document.getElementById(o.blockId);if(e){const t=e.querySelector(".activitypub-modal__overlay");t&&["top","left","right","bottom"].forEach(e=>{t.style.removeProperty(e)})}setTimeout(()=>{if(e){const t=e.querySelector(".activitypub-modal__frame");t&&r.trapFocus(t)}},50)}"function"==typeof r.onModalOpen&&r.onModalOpen(e)},closeModal(e){const o=(0,t.getContext)();o.modal.isOpen=!1;const n=(0,t.getElement)();if("actions.toggleModal"===n.ref.dataset["wpOn-Click"])n.ref.focus();else{const e=document.getElementById(o.blockId);if(e){const t=e.querySelector('[data-wp-on--click="actions.toggleModal"]');t&&t.focus()}}"function"==typeof r.onModalClose&&r.onModalClose(e)},toggleModal:o(o=>{o?.preventDefault?.();const{modal:r}=(0,t.getContext)();r.isOpen?e.closeModal(o):e.openModal(o)})},callbacks:{_abortController:null,handleModalEffects(){const{modal:e}=(0,t.getContext)();if(e.isOpen&&!e.isCompact?document.body.classList.add("modal-open"):document.body.classList.remove("modal-open"),r._abortController&&(r._abortController.abort(),r._abortController=null),e.isOpen){r._abortController=new AbortController;const{signal:e}=r._abortController;document.addEventListener("keydown",r.documentKeydown,{signal:e}),document.addEventListener("click",r.documentClick,{signal:e})}},documentKeydown(o){const{modal:r}=(0,t.getContext)();r.isOpen&&"Escape"===o.key&&e.closeModal()},documentClick(o){const{blockId:r,modal:n}=(0,t.getContext)();if(!n.isOpen)return;const l=document.getElementById(r);if(!l)return;const s=l.querySelectorAll('[data-wp-on--click="actions.toggleModal"]');for(const e of s)if(e===o.target||e.contains(o.target))return;const a=l.querySelector(".activitypub-modal__frame");a&&!a.contains(o.target)&&e.closeModal()},positionModal(){const{blockId:e}=(0,t.getContext)(),o=document.getElementById(e);if(!o)return;const r=o.querySelector(".activitypub-modal__overlay");if(!r)return;r.style.top="",r.style.left="",r.style.right="",r.style.bottom="";const n=(0,t.getElement)().ref.getBoundingClientRect(),l=window.innerWidth,s=o.getBoundingClientRect(),a={top:n.bottom-s.top+8+"px",left:n.left-s.left-2+"px"};l-n.right<250&&(a.left="auto",a.right=s.right-n.right+"px"),Object.assign(r.style,a)},trapFocus(e){const t=e.querySelectorAll('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]):not([readonly]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])'),o=t[0],r=t[t.length-1];o&&o.classList.contains("activitypub-modal__close")&&t.length>1?t[1].focus():o.focus(),e.addEventListener("keydown",function(t){if("Tab"!==t.key&&9!==t.keyCode)return;const n=e.ownerDocument.activeElement;t.shiftKey?n===o&&(r.focus(),t.preventDefault()):n===r&&(o.focus(),t.preventDefault())})}}})}();const{actions:r,callbacks:n,state:l}=(0,t.store)("activitypub/remote-reply",{state:{get remoteProfileUrl(){const{commentURL:e}=(0,t.getContext)();return l.template.replace("{uri}",encodeURIComponent(e))}},actions:{onReplyLinkKeydown:o(e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),r.toggleModal(e))}),copyToClipboard(){const e=(0,t.getContext)(),{i18n:o}=(0,t.getConfig)();navigator.clipboard.writeText(e.commentURL).then(()=>{e.copyButtonText=o.copied,setTimeout(()=>{e.copyButtonText=o.copy},1e3)},e=>{console.error("Could not copy text: ",e)})},updateRemoteProfile(e){const o=(0,t.getContext)();o.remoteProfile=e.target.value,o.isError=!1,o.errorMessage=""},onInputKeydown(e){if("Enter"===e.key)return e.preventDefault(),r.submitRemoteProfile()},*submitRemoteProfile(){const e=(0,t.getContext)(),{namespace:o,i18n:s}=(0,t.getConfig)(),{apiFetch:a}=window.wp,i=e.remoteProfile.trim();if(!i)return e.isError=!0,void(e.errorMessage=s.emptyProfileError);if(!n.isHandle(i)&&!n.isUrl(i))return e.isError=!0,void(e.errorMessage=s.invalidProfileError);e.isLoading=!0,e.isError=!1,e.errorMessage="";const c=`/${o}/comments/${e.commentId}/remote-reply?resource=${encodeURIComponent(i)}`;try{const{template:t,url:o}=yield a({path:c});e.isLoading=!1,window.open(o,"_blank"),r.closeModal(),e.shouldSaveProfile&&(n.setStore({profileURL:i,template:t}),Object.assign(l,{hasRemoteUser:!0,profileURL:i,template:t}))}catch(t){console.error("Error submitting profile:",t),e.isLoading=!1,e.isError=!0,e.errorMessage=t.message||s.genericError}},toggleRememberProfile(){const e=(0,t.getContext)();e.shouldSaveProfile=!e.shouldSaveProfile},deleteRemoteUser(){n.deleteStore(),l.hasRemoteUser=!1,l.profileURL="",l.template=""}},callbacks:{storageKey:"fediverse-remote-user",init(){const{profileURL:e,template:t}=n.getStore();e&&t&&Object.assign(l,{hasRemoteUser:!0,profileURL:e,template:t})},getStore(){const e=localStorage.getItem(n.storageKey);return e?JSON.parse(e):{}},setStore(e){localStorage.setItem(n.storageKey,JSON.stringify(e))},deleteStore(){localStorage.removeItem(n.storageKey)},isHandle(e){const t=e.replace(/^@/,"").split("@");return 2===t.length&&n.isUrl(`https://${t[1]}`)},isUrl(e){try{return new URL(e),!0}catch(e){return!1}}}})}},n={};function l(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,l),o.exports}l.m=r,t=[],l.O=(e,o,r,n)=>{if(!o){var s=1/0;for(d=0;d=n)&&Object.keys(l.O).every(e=>l.O[e](o[i]))?o.splice(i--,1):(a=!1,n0&&t[d-1][2]>n;d--)t[d]=t[d-1];t[d]=[o,r,n]},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);export{l as __webpack_require__};o={466:0,354:0},l.C=e=>{var t,r,{__webpack_esm_ids__:n,__webpack_esm_modules__:s,__webpack_esm_runtime__:a}=e,i=0;for(t in s)l.o(s,t)&&(l.m[t]=s[t]);for(a&&a(l);i0===o[e];var s=l.O(void 0,[354],()=>l(475));s=l.O(s); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/block.json b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/block.json new file mode 100644 index 00000000..2805e634 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/block.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "activitypub/reply-intent", + "title": "ActivityPub Reply Intent Handler", + "category": "widgets", + "description": "Handles reply intents for federated conversations in the block editor.", + "icon": "comments", + "textdomain": "activitypub", + "editorScript": "file:./plugin.js" +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.asset.php new file mode 100644 index 00000000..2bb3bb5f --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.asset.php @@ -0,0 +1 @@ + array('wp-block-editor', 'wp-blocks', 'wp-data', 'wp-element', 'wp-plugins'), 'version' => 'ee563d746b20aabb037a'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.js new file mode 100644 index 00000000..b0183a39 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply-intent/plugin.js @@ -0,0 +1 @@ +(()=>{"use strict";const e=window.wp.plugins,t=window.wp.blocks,i=window.wp.data,n=window.wp.blockEditor,o=window.wp.element;let r=!1;(0,e.registerPlugin)("activitypub-reply-intent",{render:()=>((0,o.useEffect)(()=>{if(r)return;const e=new URLSearchParams(window.location.search).get("in_reply_to");e&&!r&&setTimeout(()=>{const o=(0,t.createBlock)("activitypub/reply",{url:e,embedPost:!0}),r=(0,i.dispatch)(n.store);r.insertBlock(o),r.insertAfterBlock(o.clientId)},200),r=!0}),null)})})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/block.json b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/block.json new file mode 100644 index 00000000..29421d14 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/block.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "activitypub/reply", + "version": "8.3.0", + "title": "Federated Reply", + "category": "widgets", + "icon": "admin-comments", + "description": "Reply to posts, notes, and other content on the Fediverse directly from the block editor.", + "keywords": [ + "fediverse", + "activitypub", + "reply", + "federation" + ], + "supports": { + "html": false, + "inserter": true, + "reusable": false, + "lock": false, + "innerBlocks": { + "allowedBlocks": [ + "core/embed" + ] + } + }, + "textdomain": "activitypub", + "editorScript": "file:./index.js", + "editorStyle": "file:./style-index.css", + "style": "file:./index.css", + "attributes": { + "url": { + "type": "string" + }, + "embedPost": { + "type": "boolean", + "default": null + }, + "isValidActivityPub": { + "type": "boolean", + "default": true + } + } +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index-rtl.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index-rtl.css new file mode 100644 index 00000000..b92ee49a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index-rtl.css @@ -0,0 +1 @@ +.activitypub-embed-container{min-height:100px;pointer-events:none;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.activitypub-embed-loading{align-items:center;display:flex;justify-content:center}.activitypub-embed-container .wp-block-embed{pointer-events:none!important}.activitypub-embed-preview,.activitypub-embed-preview iframe{pointer-events:none}.activitypub-reply-display{margin:1em 0}.activitypub-reply-display p{margin:0}.activitypub-reply-display a{color:#2271b1;text-decoration:none}.activitypub-reply-display a:hover{color:#135e96;text-decoration:underline}.activitypub-embed{background:#fff;border:1px solid #e6e6e6;border-radius:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;max-width:100%;padding:0}.activitypub-reply-block .activitypub-embed{margin:1em 0}.activitypub-embed-header{align-items:center;display:flex;gap:10px;padding:15px}.activitypub-embed-header img{border-radius:50%;height:48px;width:48px}.activitypub-embed-header-text{flex-grow:1}.activitypub-embed-header-text h2{color:#000;font-size:15px;font-weight:600;margin:0;padding:0}.activitypub-embed-header-text .ap-account{color:#687684;font-size:14px;text-decoration:none}.activitypub-embed-content{padding:0 15px 15px}.activitypub-embed-content .ap-title{color:#000;font-size:23px;font-weight:600;margin:0 0 10px;padding:0}.activitypub-embed-content .ap-subtitle{color:#000;font-size:15px;margin:0 0 15px}.activitypub-embed-content .ap-preview{border:1px solid #e6e6e6;border-radius:8px;box-sizing:border-box;display:grid;gap:2px;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;margin:1em 0 0;min-height:64px;overflow:hidden;position:relative;width:100%}.activitypub-embed-content .ap-preview img{border:0;box-sizing:border-box;display:block;height:100%;-o-object-fit:cover;object-fit:cover;overflow:hidden;position:relative;width:100%}.activitypub-embed-content .ap-preview audio,.activitypub-embed-content .ap-preview video{display:block;grid-column:1/span 2;max-width:100%}.activitypub-embed-content .ap-preview audio{width:100%}.activitypub-embed-content .ap-preview.layout-1{grid-template-columns:1fr;grid-template-rows:1fr}.activitypub-embed-content .ap-preview.layout-2{aspect-ratio:auto;grid-template-rows:1fr;height:auto}.activitypub-embed-content .ap-preview.layout-3>img:first-child{grid-row:span 2}.activitypub-embed-content .ap-preview-text{padding:15px}.activitypub-embed-meta{border-top:1px solid #e6e6e6;color:#687684;display:flex;font-size:13px;gap:15px;padding:15px}.activitypub-embed-meta .ap-stat{align-items:center;display:flex;gap:5px}@media only screen and (max-width:399px){.activitypub-embed-meta span.ap-stat{display:none!important}}.activitypub-embed-meta a.ap-stat{color:inherit;text-decoration:none}.activitypub-embed-meta strong{color:#000;font-weight:600}.activitypub-embed-meta .ap-stat-label{color:#687684}.wp-block-activitypub-reply .components-spinner{height:12px;margin-bottom:0;margin-top:0;width:12px} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.asset.php new file mode 100644 index 00000000..63d98455 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.asset.php @@ -0,0 +1 @@ + array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-url'), 'version' => '9528bc906518de9ee951'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.css new file mode 100644 index 00000000..b92ee49a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.css @@ -0,0 +1 @@ +.activitypub-embed-container{min-height:100px;pointer-events:none;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.activitypub-embed-loading{align-items:center;display:flex;justify-content:center}.activitypub-embed-container .wp-block-embed{pointer-events:none!important}.activitypub-embed-preview,.activitypub-embed-preview iframe{pointer-events:none}.activitypub-reply-display{margin:1em 0}.activitypub-reply-display p{margin:0}.activitypub-reply-display a{color:#2271b1;text-decoration:none}.activitypub-reply-display a:hover{color:#135e96;text-decoration:underline}.activitypub-embed{background:#fff;border:1px solid #e6e6e6;border-radius:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;max-width:100%;padding:0}.activitypub-reply-block .activitypub-embed{margin:1em 0}.activitypub-embed-header{align-items:center;display:flex;gap:10px;padding:15px}.activitypub-embed-header img{border-radius:50%;height:48px;width:48px}.activitypub-embed-header-text{flex-grow:1}.activitypub-embed-header-text h2{color:#000;font-size:15px;font-weight:600;margin:0;padding:0}.activitypub-embed-header-text .ap-account{color:#687684;font-size:14px;text-decoration:none}.activitypub-embed-content{padding:0 15px 15px}.activitypub-embed-content .ap-title{color:#000;font-size:23px;font-weight:600;margin:0 0 10px;padding:0}.activitypub-embed-content .ap-subtitle{color:#000;font-size:15px;margin:0 0 15px}.activitypub-embed-content .ap-preview{border:1px solid #e6e6e6;border-radius:8px;box-sizing:border-box;display:grid;gap:2px;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;margin:1em 0 0;min-height:64px;overflow:hidden;position:relative;width:100%}.activitypub-embed-content .ap-preview img{border:0;box-sizing:border-box;display:block;height:100%;-o-object-fit:cover;object-fit:cover;overflow:hidden;position:relative;width:100%}.activitypub-embed-content .ap-preview audio,.activitypub-embed-content .ap-preview video{display:block;grid-column:1/span 2;max-width:100%}.activitypub-embed-content .ap-preview audio{width:100%}.activitypub-embed-content .ap-preview.layout-1{grid-template-columns:1fr;grid-template-rows:1fr}.activitypub-embed-content .ap-preview.layout-2{aspect-ratio:auto;grid-template-rows:1fr;height:auto}.activitypub-embed-content .ap-preview.layout-3>img:first-child{grid-row:span 2}.activitypub-embed-content .ap-preview-text{padding:15px}.activitypub-embed-meta{border-top:1px solid #e6e6e6;color:#687684;display:flex;font-size:13px;gap:15px;padding:15px}.activitypub-embed-meta .ap-stat{align-items:center;display:flex;gap:5px}@media only screen and (max-width:399px){.activitypub-embed-meta span.ap-stat{display:none!important}}.activitypub-embed-meta a.ap-stat{color:inherit;text-decoration:none}.activitypub-embed-meta strong{color:#000;font-weight:600}.activitypub-embed-meta .ap-stat-label{color:#687684}.wp-block-activitypub-reply .components-spinner{height:12px;margin-bottom:0;margin-top:0;width:12px} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.js new file mode 100644 index 00000000..956d28c9 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/reply/index.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={n:t=>{var o=t&&t.__esModule?()=>t.default:()=>t;return e.d(o,{a:o}),o},d:(t,o)=>{for(var r in o)e.o(o,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:o[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.wp.blocks,o=window.wp.primitives,r=window.ReactJSXRuntime;var i=(0,r.jsx)(o.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,r.jsx)(o.Path,{d:"M6.68822 10.625L6.24878 11.0649L5.5 11.8145L5.5 5.5L12.5 5.5V8L14 6.5V5C14 4.44772 13.5523 4 13 4H5C4.44772 4 4 4.44771 4 5V13.5247C4 13.8173 4.16123 14.086 4.41935 14.2237C4.72711 14.3878 5.10601 14.3313 5.35252 14.0845L7.31 12.125H8.375L9.875 10.625H7.31H6.68822ZM14.5605 10.4983L11.6701 13.75H16.9975C17.9963 13.75 18.7796 14.1104 19.3553 14.7048C19.9095 15.2771 20.2299 16.0224 20.4224 16.7443C20.7645 18.0276 20.7543 19.4618 20.7487 20.2544C20.7481 20.345 20.7475 20.4272 20.7475 20.4999L19.2475 20.5001C19.2475 20.4191 19.248 20.3319 19.2484 20.2394V20.2394C19.2526 19.4274 19.259 18.2035 18.973 17.1307C18.8156 16.5401 18.586 16.0666 18.2778 15.7483C17.9909 15.4521 17.5991 15.25 16.9975 15.25H11.8106L14.5303 17.9697L13.4696 19.0303L8.96956 14.5303L13.4394 9.50171L14.5605 10.4983Z"})});const c=window.wp.blockEditor,l=window.wp.components,n=window.wp.i18n,s=window.wp.element,a=window.wp.compose,d=window.wp.data,u=window.wp.apiFetch;var p=e.n(u);const b=window.wp.url,w={default:(0,n.__)("Enter the URL of a post from the Fediverse (Mastodon, Pixelfed, etc.) that you want to reply to.","activitypub"),checking:()=>(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(l.Spinner,{})," "+(0,n.__)("Checking URL…","activitypub")]}),valid:(0,n.__)("The author will be notified of your response.","activitypub"),error:(0,n.__)("This site doesn’t have ActivityPub enabled and won’t receive your reply.","activitypub")};(0,t.registerBlockType)("activitypub/reply",{edit:function({attributes:e,setAttributes:o,clientId:i,isSelected:u}){const{url:y="",embedPost:v=!1}=e,[m,h]=(0,s.useState)(w.default),[f,k]=(0,s.useState)(!1),[_,C]=(0,s.useState)(!1),x=(0,s.useRef)(),{insertAfterBlock:L,removeBlock:g,replaceInnerBlocks:P}=(0,d.useDispatch)("core/block-editor"),j=v&&!_&&f,B=(0,c.useInnerBlocksProps)({className:"activitypub-embed-container"},{allowedBlocks:["core/embed"],template:y&&j?[["core/embed",{url:y}]]:[],templateLock:"all"});(0,s.useEffect)(()=>{P(i,y&&j?[(0,t.createBlock)("core/embed",{url:y})]:[])},[y,j,i,P]),(0,s.useEffect)(()=>{h(y?_?w.checking():f?w.valid:w.error:w.default)},[y,_,f]);const S=()=>{setTimeout(()=>x.current?.focus(),50)},V=(0,s.useCallback)(async e=>{if(e)try{C(!0),new URL(e);try{const t=await p()({path:(0,b.addQueryArgs)("/oembed/1.0/proxy",{url:e,activitypub:!0})});t&&t.provider_name?(o({embedPost:!0,isValidActivityPub:!0}),k(!0)):(o({isValidActivityPub:!1}),k(!1))}catch(e){console.log("Could not fetch embed:",e),o({isValidActivityPub:!1}),k(!1)}}catch(e){o({isValidActivityPub:!1}),k(!1)}finally{C(!1)}else k(!1)},[o,k,C]),A=(0,a.useDebounce)(V,250);return(0,s.useEffect)(()=>{y&&A(y)},[y,A]),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c.InspectorControls,{children:(0,r.jsx)(l.PanelBody,{title:(0,n.__)("Settings","activitypub"),children:(0,r.jsx)(l.ToggleControl,{label:(0,n.__)("Embed Post","activitypub"),checked:!!v,onChange:e=>o({embedPost:e}),disabled:!f,help:(0,n.__)("Show embedded content from the URL.","activitypub")})})}),(0,r.jsxs)("div",{onClick:S,...(0,c.useBlockProps)(),children:[u&&(0,r.jsx)(l.TextControl,{label:(0,n.__)("Your post is a reply to the following URL","activitypub"),value:y,onChange:e=>o({url:e}),help:m,onKeyDown:e=>{"Enter"===e.key&&L(i),!y&&["Backspace","Delete"].includes(e.key)&&g(i)},ref:x,__next40pxDefaultSize:!0}),j&&(0,r.jsx)("div",{...B}),y&&!j&&!u&&(0,r.jsx)("div",{className:"activitypub-reply-block-editor__preview",contentEditable:!1,onClick:S,style:{cursor:"pointer"},children:(0,r.jsx)("a",{href:y,className:"u-in-reply-to",target:"_blank",rel:"noreferrer",children:"↬"+y.replace(/^https?:\/\//,"")})})]})]})},save:()=>null,icon:i,transforms:{from:[{type:"block",blocks:["core/embed"],transform:e=>(0,t.createBlock)("activitypub/reply",{url:e.url||"",embedPost:!0})}],to:[{type:"block",blocks:["core/embed"],transform:e=>(0,t.createBlock)("core/embed",{url:e.url||""})}]}})})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/block.json b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/block.json new file mode 100644 index 00000000..1ef1a2fe --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/block.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "name": "activitypub/stats", + "apiVersion": 3, + "version": "unreleased", + "title": "ActivityPub Stats", + "category": "widgets", + "description": "Display your annual Fediverse stats as a shareable card.", + "textdomain": "activitypub", + "icon": "chart-bar", + "keywords": [ + "fediverse", + "activitypub", + "stats", + "statistics", + "annual", + "year" + ], + "supports": { + "html": false, + "align": [ + "wide", + "full" + ], + "color": false, + "typography": false, + "spacing": { + "margin": true, + "padding": true, + "__experimentalDefaultControls": { + "padding": true + } + }, + "__experimentalBorder": { + "color": true, + "radius": true, + "style": true, + "width": true, + "__experimentalSkipSerialization": true + }, + "shadow": true + }, + "attributes": { + "selectedUser": { + "type": "string" + }, + "year": { + "type": "number" + } + }, + "editorScript": "file:./index.js", + "style": "file:./style-index.css", + "render": "file:./render.php" +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.asset.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.asset.php new file mode 100644 index 00000000..c68afb28 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.asset.php @@ -0,0 +1 @@ + array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-server-side-render'), 'version' => '7042ce0f90bb9fbbfc2a'); diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.js b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.js new file mode 100644 index 00000000..1db61d5a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/index.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,t={1868(e,t,i){const s=window.wp.blocks,r=window.wp.serverSideRender;var n=i.n(r);const a=window.wp.components,o=window.wp.blockEditor,l=window.wp.i18n,c=window.wp.element,u=window.wp.apiFetch;var p=i.n(u);const d=window.wp.data;const v=window.ReactJSXRuntime,b=(new Date).getFullYear();function h(){const e=[];for(let t=b;t>=b-5;t--)e.push({label:String(t),value:String(t)});return e}const g=JSON.parse('{"UU":"activitypub/stats"}');(0,s.registerBlockType)(g.UU,{edit:function({attributes:e,setAttributes:t}){const{selectedUser:i,year:s}=e,r=(0,o.useBlockProps)(),u=function({withInherit:e=!1}){const{enabled:t,namespace:i}=window._activityPubOptions||{},[s,r]=(0,c.useState)(!1),{fetchedUsers:n,isLoadingUsers:a}=(0,d.useSelect)(e=>{const{getUsers:i,getIsResolving:s}=e("core");return{fetchedUsers:t?.users?i({capabilities:"activitypub"}):null,isLoadingUsers:!!t?.users&&s("getUsers",[{capabilities:"activitypub"}])}},[t?.users]),o=(0,d.useSelect)(e=>n||a?null:e("core").getCurrentUser(),[n,a]);(0,c.useEffect)(()=>{!n&&!a&&o&&i&&p()({path:`/${i}/actors/${o.id}`,method:"HEAD",headers:{Accept:"application/activity+json"},parse:!1}).then(()=>r(!0)).catch(()=>r(!1))},[n,a,o,i]);const u=(0,c.useMemo)(()=>n||(o&&s?[{id:o.id,name:o.name}]:[]),[n,o,s]);return(0,c.useMemo)(()=>{if(!u.length)return[];const i=[];return t?.blog&&n&&i.push({label:(0,l.__)("Blog","activitypub"),value:"blog"}),e&&t?.users&&n&&i.push({label:(0,l.__)("Dynamic User","activitypub"),value:"inherit"}),u.reduce((e,t)=>(e.push({label:t.name,value:`${t.id}`}),e),i)},[u,t?.blog,t?.users,n,e])}({}),[g,w]=(0,c.useState)(!1);(0,c.useEffect)(()=>{!i&&u.length&&t({selectedUser:u[0].value})},[u]);const y=s||b-1,[f,_]=(0,c.useState)(""),m=(0,c.useCallback)(()=>{if(!i)return;const e=function(e,t){const i=window._activityPubOptions?.statsImageUrlEndpoint||"";if(!i)return"";const s=e&&"blog"!==e?e:0;return i.replace("{user_id}",s).replace("{year}",t)}(i,y);e&&p()({url:e}).then(e=>_(e.url||"")).catch(()=>_(""))},[i,y]);return(0,c.useEffect)(()=>{m()},[m]),(0,v.jsxs)("div",{...r,children:[(0,v.jsxs)(o.InspectorControls,{children:[(0,v.jsxs)(a.PanelBody,{title:(0,l.__)("Settings","activitypub"),children:[u.length>1&&(0,v.jsx)(a.SelectControl,{label:(0,l.__)("Select User","activitypub"),value:i,options:u,onChange:e=>t({selectedUser:e})}),(0,v.jsx)(a.SelectControl,{label:(0,l.__)("Year","activitypub"),value:String(y),options:h(),onChange:e=>t({year:parseInt(e,10)})})]}),f&&(0,v.jsxs)(a.PanelBody,{title:(0,l.__)("Share Image","activitypub"),initialOpen:!1,children:[(0,v.jsx)("p",{className:"description",children:(0,l.__)("Use this URL to share your stats as an image on social media.","activitypub")}),(0,v.jsx)(a.TextControl,{label:(0,l.__)("Share image URL","activitypub"),hideLabelFromVision:!0,__nextHasNoMarginBottom:!0,value:f,readOnly:!0,onClick:e=>e.target.select()}),(0,v.jsxs)("div",{style:{display:"flex",gap:"8px",alignItems:"center"},children:[(0,v.jsx)(a.Button,{variant:"secondary",onClick:()=>{navigator.clipboard.writeText(f).then(()=>{w(!0),setTimeout(()=>w(!1),2e3)})},children:g?(0,l.__)("Copied!","activitypub"):(0,l.__)("Copy URL","activitypub")}),(0,v.jsx)(a.ExternalLink,{href:f,children:(0,l.__)("Preview","activitypub")})]})]})]}),(0,v.jsx)(a.Disabled,{children:(0,v.jsx)(n(),{block:"activitypub/stats",attributes:{...e,year:y}})})]})}})}},i={};function s(e){var r=i[e];if(void 0!==r)return r.exports;var n=i[e]={exports:{}};return t[e](n,n.exports,s),n.exports}s.m=t,e=[],s.O=(t,i,r,n)=>{if(!i){var a=1/0;for(u=0;u=n)&&Object.keys(s.O).every(e=>s.O[e](i[l]))?i.splice(l--,1):(o=!1,n0&&e[u-1][2]>n;u--)e[u]=e[u-1];e[u]=[i,r,n]},s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var i in t)s.o(t,i)&&!s.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={85:0,721:0};s.O.j=t=>0===e[t];var t=(t,i)=>{var r,n,[a,o,l]=i,c=0;if(a.some(t=>0!==e[t])){for(r in o)s.o(o,r)&&(s.m[r]=o[r]);if(l)var u=l(s)}for(t&&t(i);cs(1868));r=s.O(r)})(); \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/render.php b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/render.php new file mode 100644 index 00000000..93f2625d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/render.php @@ -0,0 +1,239 @@ +
%s
%s
', + \esc_html__( 'Fediverse Stats', 'activitypub' ), + \sprintf( + /* translators: %d: The year */ + \esc_html__( 'No stats available for %d. Stats are collected monthly and compiled at the end of each year.', 'activitypub' ), + (int) $stats_year + ) + ); + } + return; +} + +// Get comment types for dynamic display. +$comment_types = Statistics::get_comment_types_for_stats(); + +// Calculate total engagement. +$total_engagement = 0; +foreach ( array_keys( $comment_types ) as $ct_slug ) { + $total_engagement += $summary[ $ct_slug . '_count' ] ?? 0; +} + +// Most active month name. +$most_active_month_name = ''; +if ( ! empty( $summary['most_active_month'] ) ) { + $most_active_month_name = gmdate( 'F', gmmktime( 0, 0, 0, $summary['most_active_month'], 1, $stats_year ) ); +} + +// Follower growth. +$followers_start = $summary['followers_start'] ?? 0; +$followers_end = $summary['followers_end'] ?? 0; +$followers_net_change = $summary['followers_net_change'] ?? ( $followers_end - $followers_start ); +$change_sign = $followers_net_change >= 0 ? '+' : ''; + +// Get actor webfinger for the card header. +$actor = Actors::get_by_id( $user_id ); + +if ( \is_wp_error( $actor ) ) { + // Fall back to direct model instantiation for blog/application actors. + if ( Actors::BLOG_USER_ID === $user_id ) { + $actor = new \Activitypub\Model\Blog(); + } elseif ( Actors::APPLICATION_USER_ID === $user_id ) { + $actor = new \Activitypub\Model\Application(); + } +} + +$actor_webfinger = ! \is_wp_error( $actor ) ? $actor->get_webfinger() : ''; + +// Site name for branding. +$site_name = \get_bloginfo( 'name' ); + +$block_id = 'activitypub-stats-' . \wp_unique_id(); +$title_text = \sprintf( + /* translators: %d: The year */ + \__( 'Fediverse Stats %d', 'activitypub' ), + (int) $stats_year +); + +/* + * Build border styles using WP_Style_Engine for sanitization. + * Border serialization is skipped in block.json to avoid double + * rendering in the editor, so we apply it here manually. + */ +$border_result = \wp_style_engine_get_styles( array( 'border' => $attributes['style']['border'] ?? array() ) ); +$extra_styles = $border_result['css'] ?? ''; + +// Handle preset border color slug (not part of style.border). +if ( ! empty( $attributes['borderColor'] ) ) { + $preset_color = 'var(--wp--preset--color--' . \sanitize_key( $attributes['borderColor'] ) . ')'; + $extra_styles = 'border-color:' . $preset_color . ';' . $extra_styles; +} + +// Resolve the border color for inner elements via CSS variable. +$border_color = ''; +if ( ! empty( $attributes['style']['border']['color'] ) ) { + $border_color = $attributes['style']['border']['color']; +} elseif ( ! empty( $attributes['borderColor'] ) ) { + $border_color = 'var(--wp--preset--color--' . \sanitize_key( $attributes['borderColor'] ) . ')'; +} + +if ( $border_color ) { + $extra_styles .= '--activitypub-stats--border-color:' . \esc_attr( $border_color ) . ';'; +} + +$wrapper_attrs = array( + 'id' => $block_id, + 'class' => 'activitypub-stats', +); + +$wrapper_html = \get_block_wrapper_attributes( $wrapper_attrs ); + +// Merge border styles into the existing style attribute. +if ( $extra_styles ) { + if ( \str_contains( $wrapper_html, 'style="' ) ) { + $wrapper_html = \str_replace( 'style="', 'style="' . \esc_attr( $extra_styles ), $wrapper_html ); + } else { + $wrapper_html .= ' style="' . \esc_attr( $extra_styles ) . '"'; + } +} +?> +
+ data-year="" +> +
+

+ +

+ +
+ +
+
+ + +
+
+ + +
+
+ + + +
+
+ + + + + + + +
+ + +
+ + +
+ + + +
+ + + + + + + +
+ +
+ + +
+

+
    + +
  1. + + + + + + +
  2. + +
+
+ + + +
diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index-rtl.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index-rtl.css new file mode 100644 index 00000000..3b244618 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index-rtl.css @@ -0,0 +1 @@ +.wp-block-activitypub-stats{background-color:var(--wp--preset--color--base,var(--wp--preset--color--white,#fff));color:var(--wp--preset--color--contrast,var(--wp--preset--color--black,inherit));max-width:var(--wp--style--global--content-size,600px);--activitypub-stats--border-color:color-mix(in srgb,currentcolor 20%,transparent)}.wp-block-activitypub-stats.alignwide{max-width:var(--wp--style--global--wide-size)}.wp-block-activitypub-stats.alignfull{max-width:none}.activitypub-stats__header{margin-bottom:1.5rem;text-align:center}.activitypub-stats__title{color:inherit;font-size:1.75em;font-weight:800;letter-spacing:-.02em;margin:0 0 .25rem}.activitypub-stats__subtitle{color:color-mix(in srgb,currentcolor 60%,transparent);font-size:1em;margin:0}.activitypub-stats__stats{display:flex;gap:1rem;margin-bottom:1.25rem}.activitypub-stats__stat{flex:1;padding:.75rem .5rem;text-align:center}.activitypub-stats__stat--highlight{border:1px solid var(--activitypub-stats--border-color);border-radius:8px}.activitypub-stats__stat-value{color:inherit;display:block;font-size:2em;font-weight:800;line-height:1.2}.activitypub-stats__stat--highlight .activitypub-stats__stat-value{font-size:2.5em}.activitypub-stats__stat-label{color:color-mix(in srgb,currentcolor 50%,transparent);display:block;font-size:.8em;letter-spacing:.05em;margin-top:.25rem;text-transform:uppercase}.activitypub-stats__engagement{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem}.activitypub-stats__engagement .activitypub-stats__stat{border:1px solid var(--activitypub-stats--border-color);border-radius:8px;flex:1 1 calc(33.333% - 0.5rem);min-width:5rem;padding:.625rem .5rem}.activitypub-stats__details{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:1.5rem}.activitypub-stats__detail{border:1px solid var(--activitypub-stats--border-color);border-radius:8px;flex:1 1 calc(50% - 0.5rem);min-width:7.5rem;padding:.875rem}.activitypub-stats__detail-label{color:color-mix(in srgb,currentcolor 50%,transparent);display:block;font-size:.75em;letter-spacing:.05em;margin-bottom:.25rem;text-transform:uppercase}.activitypub-stats__detail-value{color:inherit;display:block;font-size:1.25em;font-weight:700}.activitypub-stats__detail-value a{color:inherit;text-decoration:underline;text-underline-offset:.15em}.activitypub-stats__detail-value a:hover{color:color-mix(in srgb,currentcolor 70%,transparent)}.activitypub-stats__detail-value--negative,.activitypub-stats__detail-value--positive{color:inherit}.activitypub-stats__detail-extra{color:color-mix(in srgb,currentcolor 45%,transparent);display:block;font-size:.8em;margin-top:.125rem}.activitypub-stats__top-posts{margin-bottom:1.25rem}.activitypub-stats__section-title{color:color-mix(in srgb,currentcolor 50%,transparent);font-size:.85em;letter-spacing:.05em;margin:0 0 .75rem;text-transform:uppercase}.activitypub-stats__top-posts ol{list-style:decimal;margin:0;padding-right:1.5em}.activitypub-stats__top-posts li{padding:.5rem 0}.activitypub-stats__top-posts li:last-child{padding-bottom:0}.activitypub-stats__top-posts li a{color:inherit;text-decoration:none}.activitypub-stats__top-posts li a:hover{text-decoration:underline}.activitypub-stats__post-engagement{color:color-mix(in srgb,currentcolor 45%,transparent);font-size:.8em;margin-right:.25rem}.activitypub-stats__footer{margin-top:1.25rem;text-align:center}.activitypub-stats__branding{color:color-mix(in srgb,currentcolor 45%,transparent);font-size:.75em} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index.css b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index.css new file mode 100644 index 00000000..f9bbaec2 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/build/stats/style-index.css @@ -0,0 +1 @@ +.wp-block-activitypub-stats{background-color:var(--wp--preset--color--base,var(--wp--preset--color--white,#fff));color:var(--wp--preset--color--contrast,var(--wp--preset--color--black,inherit));max-width:var(--wp--style--global--content-size,600px);--activitypub-stats--border-color:color-mix(in srgb,currentcolor 20%,transparent)}.wp-block-activitypub-stats.alignwide{max-width:var(--wp--style--global--wide-size)}.wp-block-activitypub-stats.alignfull{max-width:none}.activitypub-stats__header{margin-bottom:1.5rem;text-align:center}.activitypub-stats__title{color:inherit;font-size:1.75em;font-weight:800;letter-spacing:-.02em;margin:0 0 .25rem}.activitypub-stats__subtitle{color:color-mix(in srgb,currentcolor 60%,transparent);font-size:1em;margin:0}.activitypub-stats__stats{display:flex;gap:1rem;margin-bottom:1.25rem}.activitypub-stats__stat{flex:1;padding:.75rem .5rem;text-align:center}.activitypub-stats__stat--highlight{border:1px solid var(--activitypub-stats--border-color);border-radius:8px}.activitypub-stats__stat-value{color:inherit;display:block;font-size:2em;font-weight:800;line-height:1.2}.activitypub-stats__stat--highlight .activitypub-stats__stat-value{font-size:2.5em}.activitypub-stats__stat-label{color:color-mix(in srgb,currentcolor 50%,transparent);display:block;font-size:.8em;letter-spacing:.05em;margin-top:.25rem;text-transform:uppercase}.activitypub-stats__engagement{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem}.activitypub-stats__engagement .activitypub-stats__stat{border:1px solid var(--activitypub-stats--border-color);border-radius:8px;flex:1 1 calc(33.333% - 0.5rem);min-width:5rem;padding:.625rem .5rem}.activitypub-stats__details{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:1.5rem}.activitypub-stats__detail{border:1px solid var(--activitypub-stats--border-color);border-radius:8px;flex:1 1 calc(50% - 0.5rem);min-width:7.5rem;padding:.875rem}.activitypub-stats__detail-label{color:color-mix(in srgb,currentcolor 50%,transparent);display:block;font-size:.75em;letter-spacing:.05em;margin-bottom:.25rem;text-transform:uppercase}.activitypub-stats__detail-value{color:inherit;display:block;font-size:1.25em;font-weight:700}.activitypub-stats__detail-value a{color:inherit;text-decoration:underline;text-underline-offset:.15em}.activitypub-stats__detail-value a:hover{color:color-mix(in srgb,currentcolor 70%,transparent)}.activitypub-stats__detail-value--negative,.activitypub-stats__detail-value--positive{color:inherit}.activitypub-stats__detail-extra{color:color-mix(in srgb,currentcolor 45%,transparent);display:block;font-size:.8em;margin-top:.125rem}.activitypub-stats__top-posts{margin-bottom:1.25rem}.activitypub-stats__section-title{color:color-mix(in srgb,currentcolor 50%,transparent);font-size:.85em;letter-spacing:.05em;margin:0 0 .75rem;text-transform:uppercase}.activitypub-stats__top-posts ol{list-style:decimal;margin:0;padding-left:1.5em}.activitypub-stats__top-posts li{padding:.5rem 0}.activitypub-stats__top-posts li:last-child{padding-bottom:0}.activitypub-stats__top-posts li a{color:inherit;text-decoration:none}.activitypub-stats__top-posts li a:hover{text-decoration:underline}.activitypub-stats__post-engagement{color:color-mix(in srgb,currentcolor 45%,transparent);font-size:.8em;margin-left:.25rem}.activitypub-stats__footer{margin-top:1.25rem;text-align:center}.activitypub-stats__branding{color:color-mix(in srgb,currentcolor 45%,transparent);font-size:.75em} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-activity.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-activity.php new file mode 100644 index 00000000..28a5e30a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-activity.php @@ -0,0 +1,314 @@ + 'http://joinmastodon.org/ns#', + 'QuoteRequest' => 'toot:QuoteRequest', + ), + ); + + /** + * The default types for Activities. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#activity-types + * + * @var array + */ + const TYPES = array( + 'Accept', + 'Add', + 'Announce', + 'Arrive', + 'Block', + 'Create', + 'Delete', + 'Dislike', + 'Follow', + 'Flag', + 'Ignore', + 'Invite', + 'Join', + 'Leave', + 'Like', + 'Listen', + 'Move', + 'Offer', + 'QuoteRequest', // @see https://codeberg.org/fediverse/fep/src/branch/main/fep/044f/fep-044f.md + 'Read', + 'Reject', + 'Remove', + 'TentativeAccept', + 'TentativeReject', + 'Travel', + 'Undo', + 'Update', + 'View', + ); + + /** + * The type of the object. + * + * @var string + */ + protected $type = 'Activity'; + + /** + * Describes the direct object of the activity. + * For instance, in the activity "John added a movie to his + * wishlist", the object of the activity is the movie added. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-object-term + * + * @var string|Base_Object|array|null + */ + protected $object; + + /** + * Describes one or more entities that either performed or are + * expected to perform the activity. + * Any single activity can have multiple actors. + * The actor MAY be specified using an indirect Link. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-actor + * + * @var string|array + */ + protected $actor; + + /** + * The indirect object, or target, of the activity. + * The precise meaning of the target is largely dependent on the + * type of action being described but will often be the object of + * the English preposition "to". + * For instance, in the activity "John added a movie to his + * wishlist", the target of the activity is John's wishlist. + * An activity can have more than one target. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-target + * + * @var string|array|null + */ + protected $target; + + /** + * Describes the result of the activity. + * For instance, if a particular action results in the creation of + * a new resource, the result property can be used to describe + * that new resource. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-result + * + * @var string|Base_Object|null + */ + protected $result; + + /** + * Identifies a Collection containing objects considered to be responses + * to this object. + * WordPress has a strong core system of approving replies. We only include + * approved replies here. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-replies + * + * @var array|null + */ + protected $replies; + + /** + * An indirect object of the activity from which the + * activity is directed. + * The precise meaning of the origin is the object of the English + * preposition "from". + * For instance, in the activity "John moved an item to List B + * from List A", the origin of the activity is "List A". + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-origin + * + * @var string|array|null + */ + protected $origin; + + /** + * One or more objects used (or to be used) in the completion of an + * Activity. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-instrument + * + * @var string|array|null + */ + protected $instrument; + + /** + * Set the object and copy Object properties to the Activity. + * + * Any to, bto, cc, bcc, and audience properties specified on the object + * MUST be copied over to the new "Create" activity by the server. + * + * @see https://www.w3.org/TR/activitypub/#object-without-create + * + * @param array|string|Base_Object|Activity|Actor|null $data Activity object. + */ + public function set_object( $data ) { + $object = $data; + + // Convert array to appropriate object type. + if ( is_array( $data ) ) { + if ( array_is_list( $data ) ) { + $object = array_map( array( $this, 'maybe_convert_to_object' ), $data ); + } else { + $object = $this->maybe_convert_to_object( $data ); + } + } + + $this->set( 'object', $object ); + $this->pre_fill_activity_from_object(); + } + + /** + * Fills the Activity with the specified activity object. + */ + public function pre_fill_activity_from_object() { + $object = $this->get_object(); + + // Check if `$object` is a URL and use it to generate an ID then. + if ( is_string( $object ) && filter_var( $object, FILTER_VALIDATE_URL ) && ! $this->get_id() ) { + $this->set( 'id', $object . '#activity-' . strtolower( $this->get_type() ) . '-' . time() ); + + return; + } + + // Check if `$object` is an object and copy some properties otherwise do nothing. + if ( ! is_object( $object ) ) { + return; + } + + foreach ( array( 'to', 'bto', 'cc', 'bcc', 'audience' ) as $i ) { + $value = $object->get( $i ); + if ( $value && ! $this->get( $i ) ) { + $this->set( $i, $value ); + } + } + + if ( $object->get_published() && ! $this->get_published() ) { + $this->set( 'published', $object->get_published() ); + } + + if ( $object->get_updated() && ! $this->get_updated() ) { + $this->set( 'updated', $object->get_updated() ); + } + + if ( $object->get_attributed_to() && ! $this->get_actor() ) { + $this->set( 'actor', $object->get_attributed_to() ); + } + + if ( $this->get_type() !== 'Announce' && $object->get_in_reply_to() && ! $this->get_in_reply_to() ) { + $this->set( 'in_reply_to', $object->get_in_reply_to() ); + } + + if ( $object->get_interaction_policy() && ! $this->get_interaction_policy() ) { + $this->set( 'interaction_policy', $object->get_interaction_policy() ); + } + + if ( $object->get_id() && ! $this->get_id() ) { + $id = strtok( $object->get_id(), '#' ); + if ( $object->get_updated() ) { + $updated = $object->get_updated(); + } elseif ( $object->get_published() ) { + $updated = $object->get_published(); + } else { + $updated = time(); + } + $this->set( 'id', $id . '#activity-' . strtolower( $this->get_type() ) . '-' . $updated ); + } + } + + /** + * The context of an Activity is usually just the context of the object it contains. + * + * @return array $context A compacted JSON-LD context. + */ + public function get_json_ld_context() { + if ( \is_object( $this->object ) ) { + $class = get_class( $this->object ); + if ( $class && $class::JSON_LD_CONTEXT ) { + // Without php 5.6 support this could be just: 'return $this->object::JSON_LD_CONTEXT;'. + return $class::JSON_LD_CONTEXT; + } + } + + return static::JSON_LD_CONTEXT; + } + + /** + * Convert data to the appropriate object type if it has an ActivityPub type. + * + * @param array|string|Base_Object|Activity|Actor|null $data The data to convert. + * + * @return Activity|Actor|Base_Object|Generic_Object|string|\WP_Error|null The converted object or original data. + */ + private function maybe_convert_to_object( $data ) { + if ( ! is_array( $data ) ) { + return $data; + } + + $type = $data['type'] ?? null; + + if ( in_array( $type, self::TYPES, true ) ) { + $object = self::init_from_array( $data ); + } elseif ( in_array( $type, Actor::TYPES, true ) ) { + $object = Actor::init_from_array( $data ); + } elseif ( in_array( $type, Base_Object::TYPES, true ) ) { + switch ( $type ) { + case 'Event': + $object = Event::init_from_array( $data ); + break; + case 'Place': + $object = Place::init_from_array( $data ); + break; + default: + $object = Base_Object::init_from_array( $data ); + break; + } + } else { + $object = Generic_Object::init_from_array( $data ); + } + + return $object; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-actor.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-actor.php new file mode 100644 index 00000000..064ab418 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-actor.php @@ -0,0 +1,372 @@ + 'http://schema.org#', + 'toot' => 'http://joinmastodon.org/ns#', + 'lemmy' => 'https://join-lemmy.org/ns#', + 'litepub' => 'http://litepub.social/ns#', + 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers', + 'PropertyValue' => 'schema:PropertyValue', + 'value' => 'schema:value', + 'Hashtag' => 'as:Hashtag', + 'featured' => array( + '@id' => 'toot:featured', + '@type' => '@id', + ), + 'featuredTags' => array( + '@id' => 'toot:featuredTags', + '@type' => '@id', + ), + 'moderators' => array( + '@id' => 'lemmy:moderators', + '@type' => '@id', + ), + 'alsoKnownAs' => array( + '@id' => 'as:alsoKnownAs', + '@type' => '@id', + ), + 'movedTo' => array( + '@id' => 'as:movedTo', + '@type' => '@id', + ), + 'attributionDomains' => array( + '@id' => 'toot:attributionDomains', + '@type' => '@id', + ), + 'implements' => array( + '@id' => 'https://w3id.org/fep/844e/implements', + '@type' => '@id', + '@container' => '@list', + ), + 'postingRestrictedToMods' => 'lemmy:postingRestrictedToMods', + 'discoverable' => 'toot:discoverable', + 'indexable' => 'toot:indexable', + 'invisible' => 'litepub:invisible', + ), + ); + + /** + * The default types for Actors. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#actor-types + * + * @var array + */ + const TYPES = array( + 'Application', + 'Group', + 'Organization', + 'Person', + 'Service', + ); + + /** + * The type of the object. + * + * @var string + */ + protected $type; + + /** + * A reference to an ActivityStreams OrderedCollection comprised of + * all the messages received by the actor. + * + * @see https://www.w3.org/TR/activitypub/#inbox + * + * @var string|null + */ + protected $inbox; + + /** + * A reference to an ActivityStreams OrderedCollection comprised of + * all the messages produced by the actor. + * + * @see https://www.w3.org/TR/activitypub/#outbox + * + * @var string|null + */ + protected $outbox; + + /** + * A link to an ActivityStreams collection of the actors that this + * actor is following. + * + * @see https://www.w3.org/TR/activitypub/#following + * + * @var string + */ + protected $following; + + /** + * A link to an ActivityStreams collection of the actors that + * follow this actor. + * + * @see https://www.w3.org/TR/activitypub/#followers + * + * @var string + */ + protected $followers; + + /** + * A link to an ActivityStreams collection of objects this actor has + * liked. + * + * @see https://www.w3.org/TR/activitypub/#liked + * + * @var string + */ + protected $liked; + + /** + * A list of supplementary Collections which may be of interest. + * + * @see https://www.w3.org/TR/activitypub/#streams-property + * + * @var array + */ + protected $streams = array(); + + /** + * A short username which may be used to refer to the actor, with no + * uniqueness guarantees. + * + * @see https://www.w3.org/TR/activitypub/#preferredUsername + * + * @var string|null + */ + protected $preferred_username; + + /** + * A JSON object which maps additional typically server/domain-wide + * endpoints which may be useful either for this actor or someone + * referencing this actor. This mapping may be nested inside the + * actor document as the value or may be a link to a JSON-LD + * document with these properties. + * + * @see https://www.w3.org/TR/activitypub/#endpoints + * + * @var string|array|null + */ + protected $endpoints; + + /** + * It's not part of the ActivityPub protocol, but it's a quite common + * practice to handle an actor public key with a publicKey array: + * [ + * 'id' => 'https://my-example.com/actor#main-key' + * 'owner' => 'https://my-example.com/actor', + * 'publicKeyPem' => '-----BEGIN PUBLIC KEY----- + * [...] + * -----END PUBLIC KEY-----' + * ] + * + * @see https://www.w3.org/wiki/SocialCG/ActivityPub/Authentication_Authorization#Signing_requests_using_HTTP_Signatures + * + * @var string|array|null + */ + protected $public_key; + + /** + * It's not part of the ActivityPub protocol, but it's a quite common + * practice to lock an account. If enabled, new followers will not be + * automatically accepted, but will instead require you to manually + * approve them. + * + * WordPress does only support 'false' at the moment. + * + * @see https://docs.joinmastodon.org/spec/activitypub/#as + * + * @context as:manuallyApprovesFollowers + * + * @var boolean|null + */ + protected $manually_approves_followers = false; + + /** + * Domains allowed to use `fediverse:creator` for this actor in + * published articles. + * + * @see https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/ + * + * @var array|null + */ + protected $attribution_domains = null; + + /** + * The target of the actor. + * + * @var string|null + */ + protected $moved_to; + + /** + * The alsoKnownAs of the actor. + * + * @var array|null + */ + protected $also_known_as; + + /** + * The Featured-Posts. + * + * @see https://docs.joinmastodon.org/spec/activitypub/#featured + * + * @context { + * "@id": "http://joinmastodon.org/ns#featured", + * "@type": "@id" + * } + * + * @var string|null + */ + protected $featured; + + /** + * The Featured-Tags. + * + * @see https://docs.joinmastodon.org/spec/activitypub/#featuredTags + * + * @context { + * "@id": "http://joinmastodon.org/ns#featuredTags", + * "@type": "@id" + * } + * + * @var string|null + */ + protected $featured_tags; + + /** + * Whether the User is discoverable. + * + * @see https://docs.joinmastodon.org/spec/activitypub/#discoverable + * + * @context http://joinmastodon.org/ns#discoverable + * + * @var boolean|null + */ + protected $discoverable; + + /** + * Whether the User is indexable. + * + * @see https://docs.joinmastodon.org/spec/activitypub/#indexable + * + * @context http://joinmastodon.org/ns#indexable + * + * @var boolean|null + */ + protected $indexable; + + /** + * The WebFinger Resource. + * + * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/2c59/fep-2c59.md + * + * @var string|null + */ + protected $webfinger; + + /** + * URL to the Moderators endpoint. + * + * @see https://join-lemmy.org/docs/contributors/05-federation.html + * + * @var string|null + */ + protected $moderators; + + /** + * Restrict posting to mods. + * + * @see https://join-lemmy.org/docs/contributors/05-federation.html + * + * @var boolean|null + */ + protected $posting_restricted_to_mods; + + /** + * Listing Implemented Specifications on the Application Actor + * + * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/844e/fep-844e.md + * + * @var array|null + */ + protected $implements; + + /** + * Whether the User is invisible. + * + * @see https://litepub.social/ + * + * @var boolean|null + */ + protected $invisible = null; +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-base-object.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-base-object.php new file mode 100644 index 00000000..5668cd0e --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-base-object.php @@ -0,0 +1,674 @@ + 'as:Hashtag', + 'sensitive' => 'as:sensitive', + 'dcterms' => 'http://purl.org/dc/terms/', + 'gts' => 'https://gotosocial.org/ns#', + 'schema' => 'http://schema.org/', + 'exifData' => 'schema:exifData', + 'PropertyValue' => 'schema:PropertyValue', + 'interactionPolicy' => array( + '@id' => 'gts:interactionPolicy', + '@type' => '@id', + ), + 'canQuote' => array( + '@id' => 'gts:canQuote', + '@type' => '@id', + ), + 'canReply' => array( + '@id' => 'gts:canReply', + '@type' => '@id', + ), + 'canLike' => array( + '@id' => 'gts:canLike', + '@type' => '@id', + ), + 'canAnnounce' => array( + '@id' => 'gts:canAnnounce', + '@type' => '@id', + ), + 'automaticApproval' => array( + '@id' => 'gts:automaticApproval', + '@type' => '@id', + ), + 'manualApproval' => array( + '@id' => 'gts:manualApproval', + '@type' => '@id', + ), + 'always' => array( + '@id' => 'gts:always', + '@type' => '@id', + ), + ), + ); + + /** + * The default types for Objects. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#object-types + * + * @var array + */ + const TYPES = array( + 'Article', + 'Audio', + 'Document', + 'Event', + 'Image', + 'Note', + 'Page', + 'Place', + 'Profile', + 'Relationship', + 'Tombstone', + 'Video', + ); + + /** + * The type of the object. + * + * @var string + */ + protected $type = 'Object'; + + /** + * A resource attached or related to an object that potentially + * requires special handling. + * The intent is to provide a model that is at least semantically + * similar to attachments in email. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-attachment + * + * @var string|null + */ + protected $attachment; + + /** + * One or more entities to which this object is attributed. + * The attributed entities might not be Actors. For instance, an + * object might be attributed to the completion of another activity. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-attributedto + * + * @var string|null + */ + protected $attributed_to; + + /** + * One or more entities that represent the total population of + * entities for which the object can be considered to be relevant. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-audience + * + * @var string|null + */ + protected $audience; + + /** + * The content or textual representation of the Object encoded as a + * JSON string. By default, the value of content is HTML. + * The mediaType property can be used in the object to indicate a + * different content type. + * + * The content MAY be expressed using multiple language-tagged + * values. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-content + * + * @var string|null + */ + protected $content; + + /** + * The context within which the object exists or an activity was + * performed. + * The notion of "context" used is intentionally vague. + * The intended function is to serve as a means of grouping objects + * and activities that share a common originating context or + * purpose. An example could be all activities relating to a common + * project or event. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-context + * + * @var string|null + */ + protected $context; + + /** + * The content MAY be expressed using multiple language-tagged + * values. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-content + * + * @var array|null + */ + protected $content_map; + + /** + * The date and time at which the object was deleted. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-deleted + * + * @var string|null + */ + protected $deleted; + + /** + * The former type of the object. Used in Tombstone objects to + * indicate the type of the object prior to deletion. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-formertype + * + * @var string|null + */ + protected $former_type; + + /** + * A simple, human-readable, plain-text name for the object. + * HTML markup MUST NOT be included. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-name + * + * @var string|null xsd:string + */ + protected $name; + + /** + * The name MAY be expressed using multiple language-tagged values. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-name + * + * @var array|null rdf:langString + */ + protected $name_map; + + /** + * The date and time describing the actual or expected ending time + * of the object. + * When used with an Activity object, for instance, the endTime + * property specifies the moment the activity concluded or + * is expected to conclude. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-endtime + * + * @var string|null + */ + protected $end_time; + + /** + * The entity (e.g. an application) that generated the object. + * + * @var string|null + */ + protected $generator; + + /** + * An entity that describes an icon for this object. + * The image should have an aspect ratio of one (horizontal) + * to one (vertical) and should be suitable for presentation + * at a small size. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-icon + * + * @var string|array|null + */ + protected $icon; + + /** + * An entity that describes an image for this object. + * Unlike the icon property, there are no aspect ratio + * or display size limitations assumed. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-image-term + * + * @var string|array|null + */ + protected $image; + + /** + * One or more entities for which this object is considered a + * response. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-inreplyto + * + * @var string|null + */ + protected $in_reply_to; + + /** + * One or more physical or logical locations associated with the + * object. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-location + * + * @var string|null|Place + */ + protected $location; + + /** + * An entity that provides a preview of this object. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-preview + * + * @var string|null + */ + protected $preview; + + /** + * The date and time at which the object was published + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-published + * + * @var string|null xsd:dateTime + */ + protected $published; + + /** + * The date and time describing the actual or expected starting time + * of the object. + * When used with an Activity object, for instance, the startTime + * property specifies the moment the activity began + * or is scheduled to begin. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-starttime + * + * @var string|null xsd:dateTime + */ + protected $start_time; + + /** + * A natural language summarization of the object encoded as HTML. + * Multiple language tagged summaries MAY be provided. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-summary + * + * @var string|null + */ + protected $summary; + + /** + * The content MAY be expressed using multiple language-tagged + * values. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-summary + * + * @var string[]|null + */ + protected $summary_map; + + /** + * One or more "tags" that have been associated with an objects. + * A tag can be any kind of Object. + * The key difference between attachment and tag is that the former + * implies association by inclusion, while the latter implies + * associated by reference. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-tag + * + * @var string|null + */ + protected $tag; + + /** + * The date and time at which the object was updated + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-updated + * + * @var string|null xsd:dateTime + */ + protected $updated; + + /** + * One or more links to representations of the object. + * + * @var string|null + */ + protected $url; + + /** + * An entity considered to be part of the public primary audience + * of an Object + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-to + * + * @var string|array|null + */ + protected $to; + + /** + * An Object that is part of the private primary audience of this + * Object. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-bto + * + * @var string|array|null + */ + protected $bto; + + /** + * An Object that is part of the public secondary audience of this + * Object. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-cc + * + * @var string|array|null + */ + protected $cc; + + /** + * One or more Objects that are part of the private secondary + * audience of this Object. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-bcc + * + * @var string|array|null + */ + protected $bcc; + + /** + * The MIME media type of the value of the content property. + * If not specified, the content property is assumed to contain + * text/html content. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-mediatype + * + * @var string|null + */ + protected $media_type; + + /** + * When the object describes a time-bound resource, such as an audio + * or video, a meeting, etc., the duration property indicates the + * object's approximate duration. + * The value MUST be expressed as a xsd:duration as defined by + * xmlschema11-2, section 3.3.6 (e.g. a period of 5 seconds is + * represented as "PT5S"). + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration + * + * @var string|null + */ + protected $duration; + + /** + * Intended to convey some sort of source from which the content + * markup was derived, as a form of provenance, or to support + * future editing by clients. + * + * @see https://www.w3.org/TR/activitypub/#source-property + * + * @var array|null + */ + protected $source; + + /** + * A Collection containing objects considered to be responses to + * this object. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-replies + * + * @var string|array|null + */ + protected $replies; + + /** + * A Collection containing objects considered to be likes for + * this object. + * + * @see https://www.w3.org/TR/activitypub/#likes + * + * @var array|null + */ + protected $likes; + + /** + * A Collection containing objects considered to be shares for + * this object. + * + * @see https://www.w3.org/TR/activitypub/#shares + * + * @var array|null + */ + protected $shares; + + /** + * Used to mark an object as containing sensitive content. + * Mastodon displays a content warning, requiring users to click + * through to view the content. + * + * @see https://docs.joinmastodon.org/spec/activitypub/#sensitive + * + * @var boolean|null + */ + protected $sensitive; + + /** + * The dcterms namespace. + * + * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/b2b8/fep-b2b8.md#sensitive + * @see https://www.dublincore.org/specifications/dublin-core/dcmi-terms/ + * + * @var array|null + */ + protected $dcterms; + + /** + * Interaction policy is an attempt to limit the harmful effects of unwanted replies and + * other interactions on a user's posts (e.g., "reply guys"). + * + * It is also used by Mastodon to limit the ability to quote posts. + * + * @see https://docs.gotosocial.org/en/latest/federation/interaction_policy/ + * @see https://blog.joinmastodon.org/2025/09/introducing-quote-posts/ + * + * @var array|null + */ + protected $interaction_policy; + + /** + * Fediverse Enhancement Proposal 044f: Quote Property + * + * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/044f/fep-044f.md + * @see https://w3id.org/fep/044f#quote + * + * @var string|null + */ + protected $quote; + + /** + * ActivityStreams quoteUrl property. + * + * @see https://www.w3.org/ns/activitystreams#quoteUrl + * + * @var string|null + */ + protected $quote_url; + + /** + * Fedibird-specific quoteUri property. + * + * @see https://fedibird.com/ns#quoteUri + * + * @var string|null + */ + protected $quote_uri; + + /** + * Misskey-specific quote property. + * + * @see https://misskey-hub.net/ns/#_misskey_quote + * + * @var string|null + */ + protected $_misskey_quote; // phpcs:ignore PSR2.Classes.PropertyDeclaration.Underscore + + /** + * Generic getter. + * + * @param string $key The key to get. + * + * @return mixed The value. + */ + public function get( $key ) { + if ( ! $this->has( $key ) ) { + return new \WP_Error( 'invalid_key', __( 'Invalid key', 'activitypub' ), array( 'status' => 404 ) ); + } + + return parent::get( $key ); + } + + /** + * Generic setter. + * + * @param string $key The key to set. + * @param string $value The value to set. + * + * @return mixed The value. + */ + public function set( $key, $value ) { + if ( ! $this->has( $key ) ) { + return new \WP_Error( 'invalid_key', __( 'Invalid key', 'activitypub' ), array( 'status' => 404 ) ); + } + + return parent::set( $key, $value ); + } + + /** + * Generic adder. + * + * @param string $key The key to set. + * @param mixed $value The value to add. + * + * @return mixed The value. + */ + public function add( $key, $value ) { + if ( ! $this->has( $key ) ) { + return new \WP_Error( 'invalid_key', __( 'Invalid key', 'activitypub' ), array( 'status' => 404 ) ); + } + + return parent::add( $key, $value ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-generic-object.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-generic-object.php new file mode 100644 index 00000000..e4802792 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/class-generic-object.php @@ -0,0 +1,381 @@ +to_string(); + } + + /** + * Function to transform the object to string. + * + * @return string The object id. + */ + public function to_string() { + return $this->get_id(); + } + + /** + * Magic function to implement getter and setter. + * + * @param string $method The method name. + * @param string $params The method params. + * + * @return mixed + */ + public function __call( $method, $params ) { + $var = \strtolower( \substr( $method, 4 ) ); + + if ( \strncasecmp( $method, 'get', 3 ) === 0 ) { + if ( ! $this->has( $var ) ) { + return null; + } + + return $this->$var; + } + + if ( \strncasecmp( $method, 'set', 3 ) === 0 ) { + return $this->set( $var, $params[0] ); + } + + if ( \strncasecmp( $method, 'add', 3 ) === 0 ) { + return $this->add( $var, $params[0] ); + } + + return null; + } + + /** + * Generic getter. + * + * @param string $key The key to get. + * + * @return mixed The value. + */ + public function get( $key ) { + return call_user_func( array( $this, 'get_' . $key ) ); + } + + /** + * Generic setter. + * + * @param string $key The key to set. + * @param string $value The value to set. + * + * @return mixed The value. + */ + public function set( $key, $value ) { + $this->$key = $value; + + return $this; + } + + /** + * Generic adder. + * + * @param string $key The key to set. + * @param mixed $value The value to add. + * + * @return mixed|void The value. + */ + public function add( $key, $value ) { + if ( empty( $value ) ) { + return; + } + + if ( ! isset( $this->$key ) ) { + $this->$key = array(); + } + + if ( is_string( $this->$key ) ) { + $this->$key = array( $this->$key ); + } + + $attributes = $this->$key; + + if ( is_array( $value ) ) { + $attributes = array_merge( $attributes, $value ); + } else { + $attributes[] = $value; + } + + $this->$key = array_unique( $attributes ); + + return $this->$key; + } + + /** + * Check if the object has a key + * + * @param string $key The key to check. + * + * @return boolean True if the object has the key. + */ + public function has( $key ) { + return property_exists( $this, $key ); + } + + /** + * Convert JSON input to an array. + * + * @param string $json The JSON string. + * + * @return static|\WP_Error An Object built from the JSON string or WP_Error when it's not a JSON string. + */ + public static function init_from_json( $json ) { + $array = \json_decode( $json, true ); + + if ( ! is_array( $array ) ) { + return new \WP_Error( 'invalid_json', __( 'Invalid JSON', 'activitypub' ), array( 'status' => 400 ) ); + } + + return self::init_from_array( $array ); + } + + /** + * Convert input array to a Base_Object. + * + * @param array $data The object array. + * + * @return static|\WP_Error An Object built from the input array or WP_Error when it's not an array. + */ + public static function init_from_array( $data ) { + if ( ! is_array( $data ) ) { + return new \WP_Error( 'invalid_array', __( 'Invalid array', 'activitypub' ), array( 'status' => 400 ) ); + } + + $object = new static(); + $object->from_array( $data ); + + return $object; + } + + /** + * Convert JSON input to an array and pre-fill the object. + * + * @param array $data The array. + */ + public function from_array( $data ) { + foreach ( $data as $key => $value ) { + if ( null !== $value ) { + // Convert camelCase to snake_case if not prefixed with '_'. + if ( ! \str_starts_with( $key, '_' ) ) { + $key = camel_to_snake_case( $key ); + } + + call_user_func( array( $this, 'set_' . $key ), $value ); + } + } + } + + /** + * Convert JSON input to an array and pre-fill the object. + * + * @param string $json The JSON string. + */ + public function from_json( $json ) { + $array = \json_decode( $json, true ); + + $this->from_array( $array ); + } + + /** + * Convert Object to an array. + * + * It tries to get the object attributes if they exist + * and falls back to the getters. Empty values are ignored. + * + * By default, `bto` and `bcc` (the blind audience fields) are stripped + * from the output per ActivityPub Section 6, so every serialization path + * is safe for emission. Internal callers that need to persist the blind + * audience (e.g., outbox/inbox storage) can opt in by passing + * `$include_blind_audience = true`. + * + * @param bool $include_json_ld_context Whether to include the JSON-LD context. Default true. + * @param bool $include_blind_audience Whether to keep `bto` and `bcc` in the output. Default false. + * + * @return array An array built from the Object. + */ + public function to_array( $include_json_ld_context = true, $include_blind_audience = false ) { + $array = array(); + $vars = get_object_vars( $this ); + + foreach ( $vars as $key => $value ) { + if ( \is_wp_error( $value ) ) { + continue; + } + + // Ignore all _prefixed keys. + if ( '_' === substr( $key, 0, 1 ) ) { + continue; + } + + // If value is empty, try to get it from a getter. + if ( ! $value ) { + $value = call_user_func( array( $this, 'get_' . $key ) ); + } + + if ( is_object( $value ) ) { + $value = $value->to_array( false, $include_blind_audience ); + } + + if ( is_array( $value ) && $this->is_namespaced( $key ) ) { + foreach ( $value as $sub_key => $sub_value ) { + $array[ snake_to_camel_case( $key ) . ':' . snake_to_camel_case( $sub_key ) ] = $sub_value; + } + } elseif ( isset( $value ) ) { + $array[ snake_to_camel_case( $key ) ] = $value; + } + } + + if ( $include_json_ld_context ) { + // Get JsonLD context and move it to '@context' at the top. + $array = array_merge( array( '@context' => $this->get_json_ld_context() ), $array ); + } + + $class = new \ReflectionClass( $this ); + $class = strtolower( $class->getShortName() ); + + /** + * Filter the array of the ActivityPub object. + * + * @param array $array The array of the ActivityPub object. + * @param string $class The class of the ActivityPub object. + * @param string $id The ID of the ActivityPub object. + * @param Generic_Object $object The ActivityPub object. + * + * @return array The filtered array of the ActivityPub object. + */ + $array = \apply_filters( 'activitypub_activity_object_array', $array, $class, $this->id, $this ); + + /** + * Filter the array of the ActivityPub object by class. + * + * @param array $array The array of the ActivityPub object. + * @param string $id The ID of the ActivityPub object. + * @param Generic_Object $object The ActivityPub object. + * + * @return array The filtered array of the ActivityPub object. + */ + $array = \apply_filters( "activitypub_activity_{$class}_object_array", $array, $this->id, $this ); + + if ( ! $include_blind_audience ) { + /* + * Strip `bto` and `bcc` from the serialized array per ActivityPub Section 6. + * Callers that need the blind audience either read it from the object via + * `get_bto()` / `get_bcc()` or opt in with `$include_blind_audience = true`. + */ + unset( $array['bto'], $array['bcc'] ); + if ( isset( $array['object'] ) && \is_array( $array['object'] ) ) { + unset( $array['object']['bto'], $array['object']['bcc'] ); + } + } + + return $array; + } + + /** + * Convert Object to JSON. + * + * @param bool $include_json_ld_context Whether to include the JSON-LD context. Default true. + * @param bool $include_blind_audience Whether to keep `bto` and `bcc` in the output. Default false. + * + * @return string The JSON string. + */ + public function to_json( $include_json_ld_context = true, $include_blind_audience = false ) { + $array = $this->to_array( $include_json_ld_context, $include_blind_audience ); + $options = \JSON_HEX_TAG | \JSON_HEX_AMP | \JSON_HEX_QUOT | \JSON_UNESCAPED_SLASHES; + + /** + * Options to be passed to json_encode(). + * + * @param int $options The current options flags. + */ + $options = \apply_filters( 'activitypub_json_encode_options', $options ); + + return \wp_json_encode( $array, $options ); + } + + /** + * Returns the keys of the object vars. + * + * @return array The keys of the object vars. + */ + public function get_object_var_keys() { + return \array_keys( \get_object_vars( $this ) ); + } + + /** + * Returns the JSON-LD context of this object. + * + * @return array $context A compacted JSON-LD context for the ActivityPub object. + */ + public function get_json_ld_context() { + return static::JSON_LD_CONTEXT; + } + + /** + * Checks if an attribute is in a namespace. + * + * @param string $attribute The attribute to check. + * + * @return bool Whether the attribute is namespaced. + */ + private function is_namespaced( $attribute ) { + $namespaces = array(); + + foreach ( static::JSON_LD_CONTEXT as $context ) { + if ( is_array( $context ) ) { + $namespaces = \array_merge( $namespaces, $context ); + } + } + + return isset( $namespaces[ $attribute ] ) && \wp_http_validate_url( $namespaces[ $attribute ] ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/README.md b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/README.md new file mode 100644 index 00000000..c5ffee43 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/README.md @@ -0,0 +1,5 @@ +# Extended Objects + +This folder contains more complex ActivityPub objects. + +Although they could be created using the `Base_Object`, they provide an easier structure for creating objects with maximum compatibility. diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-event.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-event.php new file mode 100644 index 00000000..65f5be4c --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-event.php @@ -0,0 +1,415 @@ + 'https://joinpeertube.org/ns#', + 'mz' => 'https://joinmobilizon.org/ns#', + 'status' => 'http://www.w3.org/2002/12/cal/ical#status', + 'commentsEnabled' => 'pt:commentsEnabled', + 'isOnline' => 'mz:isOnline', + 'timezone' => 'mz:timezone', + 'participantCount' => 'mz:participantCount', + 'anonymousParticipationEnabled' => 'mz:anonymousParticipationEnabled', + 'joinMode' => array( + '@id' => 'mz:joinMode', + '@type' => 'mz:joinModeType', + ), + 'externalParticipationUrl' => array( + '@id' => 'mz:externalParticipationUrl', + '@type' => 'schema:URL', + ), + 'repliesModerationOption' => array( + '@id' => 'mz:repliesModerationOption', + '@type' => '@vocab', + ), + 'contacts' => array( + '@id' => 'mz:contacts', + '@type' => '@id', + ), + ), + ); + + /** + * Mobilizon compatible values for repliesModerationOption. + * + * @var array + */ + const REPLIES_MODERATION_OPTION_TYPES = array( 'allow_all', 'closed' ); + + /** + * Mobilizon compatible values for joinModeTypes. + */ + const JOIN_MODE_TYPES = array( 'free', 'restricted', 'external' ); // and 'invite', but not used by mobilizon atm. + + /** + * Allowed values for ical VEVENT STATUS. + * + * @var array + */ + const ICAL_EVENT_STATUS_TYPES = array( 'TENTATIVE', 'CONFIRMED', 'CANCELLED' ); + + /** + * Default event categories. + * + * These values currently reflect the default set as proposed by Mobilizon to maximize interoperability. + * + * @var array + */ + const DEFAULT_EVENT_CATEGORIES = array( + 'ARTS', + 'BOOK_CLUBS', + 'BUSINESS', + 'CAUSES', + 'COMEDY', + 'CRAFTS', + 'FOOD_DRINK', + 'HEALTH', + 'MUSIC', + 'AUTO_BOAT_AIR', + 'COMMUNITY', + 'FAMILY_EDUCATION', + 'FASHION_BEAUTY', + 'FILM_MEDIA', + 'GAMES', + 'LANGUAGE_CULTURE', + 'LEARNING', + 'LGBTQ', + 'MOVEMENTS_POLITICS', + 'NETWORKING', + 'PARTY', + 'PERFORMING_VISUAL_ARTS', + 'PETS', + 'PHOTOGRAPHY', + 'OUTDOORS_ADVENTURE', + 'SPIRITUALITY_RELIGION_BELIEFS', + 'SCIENCE_TECH', + 'SPORTS', + 'THEATRE', + 'MEETING', // Default value. + ); + + /** + * Event is an implementation of one of the Activity Streams. + * + * @var string + */ + protected $type = 'Event'; + + /** + * The Title of the event. + * + * @var string + */ + protected $name; + + /** + * The event's contacts. + * + * @context { + * '@id' => 'mz:contacts', + * '@type' => '@id', + * } + * + * @var array Array of contacts (ActivityPub actor IDs). + */ + protected $contacts; + + /** + * Extension invented by PeerTube whether comments/replies are + * Mobilizon also implemented this as a fallback to their own + * repliesModerationOption. + * + * @see https://docs.joinpeertube.org/api/activitypub#video + * @see https://docs.joinmobilizon.org/contribute/activity_pub/ + * @var bool|null + */ + protected $comments_enabled; + + /** + * Timezone of the event. + * + * @context https://joinmobilizon.org/ns#timezone + * @var string + */ + protected $timezone; + + /** + * Moderation option for replies. + * + * @context https://joinmobilizon.org/ns#repliesModerationOption + * @see https://docs.joinmobilizon.org/contribute/activity_pub/#repliesmoderation + * @var string + */ + protected $replies_moderation_option; + + /** + * Whether anonymous participation is enabled. + * + * @context https://joinmobilizon.org/ns#anonymousParticipationEnabled + * @see https://docs.joinmobilizon.org/contribute/activity_pub/#anonymousparticipationenabled + * @var bool + */ + protected $anonymous_participation_enabled; + + /** + * The event's category. + * + * @context https://schema.org/category + * @var string + */ + protected $category; + + /** + * Language of the event. + * + * @context https://schema.org/inLanguage + * @var string + */ + protected $in_language; + + /** + * Whether the event is online. + * + * @context https://joinmobilizon.org/ns#isOnline + * @var bool + */ + protected $is_online; + + /** + * The event's status. + * + * @context https://www.w3.org/2002/12/cal/ical#status + * @var string + */ + protected $status; + + /** + * Which actor created the event. + * + * This field is needed due to the current group structure of Mobilizon. + * + * @todo this seems to not be a default property of an Object but needed by mobilizon. + * @var string + */ + protected $actor; + + /** + * The external participation URL. + * + * @context https://joinmobilizon.org/ns#externalParticipationUrl + * @var string + */ + protected $external_participation_url; + + /** + * Indicator of how new members may be able to join. + * + * @context https://joinmobilizon.org/ns#joinMode + * @see https://docs.joinmobilizon.org/contribute/activity_pub/#joinmode + * @var string + */ + protected $join_mode; + + /** + * The participant count of the event. + * + * @context https://joinmobilizon.org/ns#participantCount + * @var int + */ + protected $participant_count; + + /** + * How many places there can be for an event. + * + * @context https://schema.org/maximumAttendeeCapacity + * @see https://docs.joinmobilizon.org/contribute/activity_pub/#maximumattendeecapacity + * @var int + */ + protected $maximum_attendee_capacity; + + /** + * The number of attendee places for an event that remain unallocated. + * + * @context https://schema.org/remainingAttendeeCapacity + * @see https://docs.joinmobilizon.org/contribute/activity_pub/#remainignattendeecapacity + * @var int + */ + protected $remaining_attendee_capacity; + + /** + * Setter for the timezone. + * + * The passed timezone is only set when it is a valid one, otherwise the site's timezone is used. + * + * @param string $timezone The timezone string to be set, e.g. 'Europe/Berlin'. + * @return Event + */ + public function set_timezone( $timezone ) { + if ( in_array( $timezone, timezone_identifiers_list(), true ) ) { + $this->timezone = $timezone; + } else { + $this->timezone = wp_timezone_string(); + } + + return $this; + } + + /** + * Custom setter for repliesModerationOption which also directly sets commentsEnabled accordingly. + * + * @param string $type The type of the replies moderation option. + * + * @return Event + */ + public function set_replies_moderation_option( $type ) { + if ( in_array( $type, self::REPLIES_MODERATION_OPTION_TYPES, true ) ) { + $this->replies_moderation_option = $type; + $this->comments_enabled = ( 'allow_all' === $type ) ? true : false; + } else { + _doing_it_wrong( + __METHOD__, + 'The replies moderation option must be either allow_all or closed.', + '' + ); + } + + return $this; + } + + /** + * Custom setter for commentsEnabled which also directly sets repliesModerationOption accordingly. + * + * @param bool $comments_enabled Whether comments are enabled. + * + * @return Event + */ + public function set_comments_enabled( $comments_enabled ) { + if ( is_bool( $comments_enabled ) ) { + $this->comments_enabled = $comments_enabled; + $this->replies_moderation_option = $comments_enabled ? 'allow_all' : 'closed'; + } else { + _doing_it_wrong( + __METHOD__, + 'The commentsEnabled must be boolean.', + '' + ); + } + + return $this; + } + + /** + * Custom setter for the ical status that checks whether the status is an ical event status. + * + * @param string $status The status of the event. + * + * @return Event + */ + public function set_status( $status ) { + if ( in_array( $status, self::ICAL_EVENT_STATUS_TYPES, true ) ) { + $this->status = $status; + } else { + _doing_it_wrong( + __METHOD__, + 'The status of the event must be a VEVENT iCal status.', + '' + ); + } + + return $this; + } + + /** + * Custom setter for the event category. + * + * Falls back to Mobilizon's default category. + * + * @param string $category The category of the event. + * @param bool $mobilizon_compatibility Optional. Whether the category must be compatibly with Mobilizon. Default true. + * + * @return Event + */ + public function set_category( $category, $mobilizon_compatibility = true ) { + if ( $mobilizon_compatibility ) { + $this->category = in_array( $category, self::DEFAULT_EVENT_CATEGORIES, true ) ? $category : 'MEETING'; + } else { + $this->category = $category; + } + + return $this; + } + + /** + * Custom setter for an external participation url. + * + * Automatically sets the joinMode to true if called. + * + * @param string $url The URL for external participation. + * + * @return Event + */ + public function set_external_participation_url( $url ) { + if ( preg_match( '/^https?:\/\/.*/i', $url ) ) { + $this->external_participation_url = $url; + $this->join_mode = 'external'; + } + + return $this; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-place.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-place.php new file mode 100644 index 00000000..16e682ca --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-place.php @@ -0,0 +1,119 @@ += 0.0f, <= 100.0f] + */ + protected $accuracy; + + /** + * Indicates the altitude of a place. The measurement unit is indicated using the unit's property. + * If unit is not specified, the default is assumed to be "m" indicating meters. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-altitude + * @var float xsd:float + */ + protected $altitude; + + /** + * The latitude of a place. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-latitude + * @var float xsd:float + */ + protected $latitude; + + /** + * The longitude of a place. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-longitude + * @var float xsd:float + */ + protected $longitude; + + /** + * The radius from the given latitude and longitude for a Place. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-radius + * @var float + */ + protected $radius; + + /** + * Specifies the measurement units for the `radius` and `altitude` properties. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-units + * @var string + */ + protected $units; + + /** + * The address of the place. + * + * @see https://schema.org/PostalAddress + * @var array|string + */ + protected $address; + + /** + * Set the address of the place. + * + * @param array|string $address The address of the place. + */ + public function set_address( $address ) { + if ( is_string( $address ) || is_array( $address ) ) { + $this->address = $address; + } else { + _doing_it_wrong( + __METHOD__, + 'The address must be either a string or an array like schema.org/PostalAddress.', + '' + ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-quote-authorization.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-quote-authorization.php new file mode 100644 index 00000000..74860e53 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/activity/extended-object/class-quote-authorization.php @@ -0,0 +1,70 @@ + 'https://w3id.org/fep/044f#QuoteAuthorization', + 'gts' => 'https://gotosocial.org/ns#', + 'interactingObject' => array( + '@id' => 'gts:interactingObject', + '@type' => '@id', + ), + 'interactionTarget' => array( + '@id' => 'gts:interactionTarget', + '@type' => '@id', + ), + ), + ); + + /** + * The type of the object. + * + * @var string + */ + protected $type = 'QuoteAuthorization'; + + /** + * The object that is being interacted with. + * + * @var Base_Object|string|array|null + */ + protected $interacting_object; + + /** + * The target of the interaction. + * + * @var Base_Object|string|array|null + */ + protected $interaction_target; +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-avatar.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-avatar.php new file mode 100644 index 00000000..1dbce368 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-avatar.php @@ -0,0 +1,172 @@ + self::MAX_DIMENSION ) ); + + return $cached_url ?: $url; + } + + /** + * Maybe clean up cached avatar when actor is deleted. + * + * @param int $post_id The post ID being deleted. + */ + public static function maybe_cleanup( $post_id ) { + if ( Remote_Actors::POST_TYPE !== \get_post_type( $post_id ) ) { + return; + } + + self::invalidate_entity( $post_id ); + } + + /** + * Save an avatar for an actor. + * + * This is a convenience method that wraps get_or_cache with the correct options. + * It also invalidates any existing avatar before caching the new one. + * + * @param int $actor_id The actor post ID. + * @param string $avatar_url The remote avatar URL. + * + * @return string|false The local avatar URL on success, false on failure. + */ + public static function save( $actor_id, $avatar_url ) { + // Validate actor_id is a positive integer. + $actor_id = (int) $actor_id; + if ( $actor_id <= 0 ) { + return false; + } + + if ( empty( $avatar_url ) || ! \filter_var( $avatar_url, FILTER_VALIDATE_URL ) ) { + return false; + } + + // Delete existing avatar files before saving new one. + self::invalidate_entity( $actor_id ); + + return self::cache( + $avatar_url, + $actor_id, + array( 'max_dimension' => self::MAX_DIMENSION ) + ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-emoji.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-emoji.php new file mode 100644 index 00000000..bf76c331 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-emoji.php @@ -0,0 +1,184 @@ + self::MAX_DIMENSION ); + if ( $updated ) { + $options['updated'] = $updated; + } + + return self::get_or_cache( $emoji_url, $domain, $options ); + } + + /** + * Generate a hash for an emoji URL. + * + * Uses full URL path hash to prevent collisions between emoji with the same + * filename but different paths (e.g., /set1/kappa.png vs /set2/kappa.png). + * + * @param string $url The URL to hash. + * + * @return string The hash string. + */ + protected static function generate_hash( $url ) { + $url_path = \wp_parse_url( $url, PHP_URL_PATH ); + if ( $url_path ) { + return \md5( $url_path ); + } + + // Fall back to full URL hash. + return parent::generate_hash( $url ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-file.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-file.php new file mode 100644 index 00000000..14fe4922 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-file.php @@ -0,0 +1,671 @@ + $upload_dir['basedir'] . static::get_base_dir() . $entity_id, + 'baseurl' => $upload_dir['baseurl'] . static::get_base_dir() . $entity_id, + ); + } + + /** + * Get a cached file URL if it exists. + * + * @param string $url The remote URL. + * @param string|int $entity_id The entity identifier. + * + * @return string|false The local URL if cached, false otherwise. + */ + public static function get( $url, $entity_id ) { + if ( empty( $url ) || ! \filter_var( $url, FILTER_VALIDATE_URL ) ) { + return false; + } + + $paths = static::get_storage_paths( $entity_id ); + + if ( ! \is_dir( $paths['basedir'] ) ) { + return false; + } + + $hash = static::generate_hash( $url ); + $pattern = static::escape_glob_pattern( $paths['basedir'] . '/' . $hash ) . '.*'; + $matches = \glob( $pattern ); + + if ( ! empty( $matches ) && \is_file( $matches[0] ) ) { + return $paths['baseurl'] . '/' . \basename( $matches[0] ); + } + + return false; + } + + /** + * Get a cached file or cache it if not present. + * + * This is the main entry point for lazy caching. Called via filter hooks. + * + * @param string $url The remote URL. + * @param string|int $entity_id The entity identifier. + * @param array $options Optional. Additional options like 'updated' timestamp. + * + * @return string|false The local URL on success, false on failure. + */ + public static function get_or_cache( $url, $entity_id, $options = array() ) { + if ( empty( $url ) || ! \filter_var( $url, FILTER_VALIDATE_URL ) ) { + return false; + } + + // Check if already cached. + $cached_url = static::get( $url, $entity_id ); + if ( $cached_url ) { + // Check for staleness if updated timestamp provided. + if ( ! empty( $options['updated'] ) ) { + $paths = static::get_storage_paths( $entity_id ); + $hash = static::generate_hash( $url ); + $pattern = static::escape_glob_pattern( $paths['basedir'] . '/' . $hash ) . '.*'; + $matches = \glob( $pattern ); + $file_path = ( $matches && \is_file( $matches[0] ) ) ? $matches[0] : null; + $local_time = $file_path ? \filemtime( $file_path ) : 0; + $remote_time = \strtotime( $options['updated'] ); + + if ( $remote_time && $local_time >= $remote_time ) { + return $cached_url; + } + // Stale - continue to re-download. + } else { + return $cached_url; + } + } + + // Download and cache the file. + return static::cache( $url, $entity_id, $options ); + } + + /** + * Cache a remote file locally. + * + * Downloads the file, validates it, optimizes images, and stores locally. + * + * @param string $url The remote URL. + * @param string|int $entity_id The entity identifier. + * @param array $options Optional. Additional options. + * + * @return string|false The local URL on success, false on failure. + */ + public static function cache( $url, $entity_id, $options = array() ) { + $result = static::download_and_validate( $url ); + + if ( \is_wp_error( $result ) || empty( $result['file'] ) ) { + return false; + } + + $tmp_file = $result['file']; + $paths = static::get_storage_paths( $entity_id ); + + // Create directory if it doesn't exist. + if ( ! \wp_mkdir_p( $paths['basedir'] ) ) { + \wp_delete_file( $tmp_file ); + return false; + } + + // Generate hash-based filename. + $hash = static::generate_hash( $url ); + $ext = \pathinfo( $tmp_file, PATHINFO_EXTENSION ); + if ( empty( $ext ) ) { + $ext = \wp_get_default_extension_for_mime_type( $result['mime_type'] ); + } + $file_name = $hash . '.' . $ext; + $file_path = $paths['basedir'] . '/' . $file_name; + + // Move file to destination. + if ( ! static::get_filesystem()->move( $tmp_file, $file_path, true ) ) { + \wp_delete_file( $tmp_file ); + return false; + } + + // Optimize image if applicable. + $max_dimension = $options['max_dimension'] ?? static::get_max_dimension(); + $file_path = static::optimize_image( $file_path, $max_dimension ); + $file_name = \basename( $file_path ); + + $local_url = $paths['baseurl'] . '/' . $file_name; + + /** + * Fires after a remote media file has been successfully cached. + * + * Use this hook for logging, analytics, or post-processing. + * + * @since 5.6.0 + * + * @param string $local_url The local URL of the cached file. + * @param string $url The original remote URL. + * @param string|int $entity_id The entity identifier. + * @param string $type The cache type ('avatar', 'media', 'emoji'). + * @param string $file_path The local file system path. + */ + \do_action( 'activitypub_media_cached', $local_url, $url, $entity_id, static::get_type(), $file_path ); + + return $local_url; + } + + /** + * Invalidate cached files for an entity. + * + * Deletes the entire entity directory and all its contents. + * + * @param string|int $entity_id The entity identifier. + * + * @return bool True on success, false on failure. + */ + public static function invalidate_entity( $entity_id ) { + $paths = static::get_storage_paths( $entity_id ); + + return static::delete_directory( $paths['basedir'] ); + } + + /** + * Get a direct filesystem instance. + * + * Uses WP_Filesystem_Direct explicitly instead of WP_Filesystem(), + * which may fall back to FTP on servers where ABSPATH is not writable. + * The uploads directory (where cache files live) is always writable by + * the web server — the same assumption WordPress core makes for media + * uploads in _wp_handle_upload(). + * + * @since 8.0.0 + * + * @return \WP_Filesystem_Direct The direct filesystem instance. + */ + protected static function get_filesystem() { + static $filesystem = null; + + if ( null === $filesystem ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php'; + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php'; + + $filesystem = new \WP_Filesystem_Direct( null ); + } + + return $filesystem; + } + + /** + * Delete a directory and all its contents. + * + * @since 8.0.0 + * + * @param string $basedir The directory path to delete. + * + * @return bool True on success or if directory doesn't exist, false on failure. + */ + public static function delete_directory( $basedir ) { + if ( ! \is_dir( $basedir ) ) { + return true; + } + + return static::get_filesystem()->rmdir( $basedir, true ); + } + + /** + * Generate a hash for a URL. + * + * Uses full MD5 hash (32 characters) for better collision resistance. + * With truncated hashes, collision probability increases significantly + * at scale. + * + * @param string $url The URL to hash. + * + * @return string The full MD5 hash string (32 characters). + */ + protected static function generate_hash( $url ) { + return \md5( $url ); + } + + /** + * Escape glob metacharacters in a pattern. + * + * This prevents special characters (*, ?, [, ]) from being interpreted + * as glob patterns when searching for files. + * + * @param string $pattern The pattern to escape. + * + * @return string The escaped pattern safe for use in glob(). + */ + protected static function escape_glob_pattern( $pattern ) { + return \preg_replace( '/([*?\[\]])/', '[$1]', $pattern ); + } + + /** + * Validate a URL is safe to fetch. + * + * @param string $url The URL to validate. + * + * @return bool True if URL is safe to fetch, false otherwise. + */ + protected static function is_safe_url( $url ) { + if ( empty( $url ) || ! \filter_var( $url, FILTER_VALIDATE_URL ) ) { + return false; + } + + /** + * Filters whether a URL passes safety validation. + * + * By default, uses wp_http_validate_url() which prevents SSRF attacks + * by blocking private IPs and localhost. This filter allows overriding + * for testing or custom validation needs. + * + * @since 5.6.0 + * + * @param bool|null $is_safe Whether the URL is safe. Return true/false to override, + * or null to use default wp_http_validate_url() check. + * @param string $url The URL being validated. + */ + $is_safe = \apply_filters( 'activitypub_cache_is_safe_url', null, $url ); + + if ( null !== $is_safe ) { + return (bool) $is_safe; + } + + return (bool) \wp_http_validate_url( $url ); + } + + /** + * Get allowed MIME types for this cache type. + * + * @return array Array of allowed MIME types. + */ + protected static function get_allowed_mime_types() { + $type = static::get_type(); + + /** + * Filters the allowed MIME types for a cache type. + * + * Use this filter to add or remove allowed MIME types. + * + * @since 5.6.0 + * + * @param array $mime_types Array of allowed MIME types. + * @param string $type The cache type ('avatar', 'media', 'emoji'). + */ + return (array) \apply_filters( 'activitypub_cache_allowed_mime_types', static::DEFAULT_ALLOWED_MIME_TYPES, $type ); + } + + /** + * Download and validate a remote file. + * + * @param string $url The remote URL to download. + * + * @return array|\WP_Error { + * Array on success, WP_Error on failure. + * + * @type string $file Path to downloaded file. + * @type string $mime_type Validated MIME type. + * } + */ + protected static function download_and_validate( $url ) { + $type = static::get_type(); + + /** + * Filters the download result before fetching a URL. + * + * Allows short-circuiting the download process by providing a pre-downloaded + * file path. Useful for testing or when files are already available locally. + * + * @since 5.6.0 + * + * @param array|null $result { + * Return null to proceed with download, or array with file info. + * + * @type string $file Path to the downloaded file. + * @type string $mime_type The file's MIME type. + * } + * @param string $url The URL that would be downloaded. + * @param string $type The cache type ('avatar', 'media', 'emoji'). + */ + $pre_download = \apply_filters( 'activitypub_pre_download_url', null, $url, $type ); + + if ( null !== $pre_download ) { + return $pre_download; + } + + /** + * Filters whether a URL should be cached. + * + * Allows preventing specific URLs from being downloaded and cached. + * Return false to skip caching this URL. + * + * @since 5.6.0 + * + * @param bool $should_cache Whether to cache this URL. Default true. + * @param string $url The remote URL. + * @param string $type The cache type ('avatar', 'media', 'emoji'). + */ + $should_cache = \apply_filters( 'activitypub_should_cache_url', true, $url, $type ); + + if ( ! $should_cache ) { + return new \WP_Error( 'cache_skipped', \__( 'URL caching was skipped by filter.', 'activitypub' ) ); + } + + // Validate URL is safe to fetch. + if ( ! static::is_safe_url( $url ) ) { + return new \WP_Error( 'invalid_url', \__( 'URL is not allowed.', 'activitypub' ) ); + } + + if ( ! \function_exists( 'download_url' ) ) { + require_once ABSPATH . 'wp-admin/includes/file.php'; + } + + $tmp_file = \download_url( $url, 15 ); // 15 second timeout. + + if ( \is_wp_error( $tmp_file ) ) { + return $tmp_file; + } + + // Validate file size. + $file_size = \filesize( $tmp_file ); + if ( $file_size > static::MAX_FILE_SIZE ) { + \wp_delete_file( $tmp_file ); + return new \WP_Error( 'file_too_large', \__( 'File exceeds maximum size limit.', 'activitypub' ) ); + } + + // Validate MIME type. + $validation = static::validate_mime_type( $tmp_file ); + if ( \is_wp_error( $validation ) ) { + \wp_delete_file( $tmp_file ); + return $validation; + } + + // Get the validated file path (may have been renamed). + $file_path = \is_string( $validation ) ? $validation : $tmp_file; + $mime_type = static::get_file_mime_type( $file_path ); + + return array( + 'file' => $file_path, + 'mime_type' => $mime_type, + ); + } + + /** + * Validate MIME type of a file using multiple methods. + * + * This method addresses potential wp_get_image_mime() bypass concerns + * by using finfo, getimagesize, and wp_check_filetype_and_ext for validation. + * + * @param string $file_path Path to the file. + * + * @return string|\WP_Error File path (possibly renamed) on success, WP_Error on failure. + */ + protected static function validate_mime_type( $file_path ) { + $allowed_mime_types = static::get_allowed_mime_types(); + + // Require fileinfo extension for validation. + if ( ! \extension_loaded( 'fileinfo' ) ) { + return new \WP_Error( 'finfo_failed', \__( 'Fileinfo extension not available.', 'activitypub' ) ); + } + + // Method 1: Use cached finfo instance for reliable MIME detection. + if ( null === self::$finfo ) { + self::$finfo = new \finfo( FILEINFO_MIME_TYPE ); + } + + $mime = self::$finfo->file( $file_path ); + + if ( ! \in_array( $mime, $allowed_mime_types, true ) ) { + return new \WP_Error( 'invalid_mime', \__( 'File type not allowed.', 'activitypub' ) ); + } + + // Method 2: Verify it's actually a valid image. + $image_info = @\getimagesize( $file_path ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + if ( false === $image_info ) { + return new \WP_Error( 'invalid_image', \__( 'File is not a valid image.', 'activitypub' ) ); + } + + // Verify image can actually be rendered. + if ( ! \function_exists( 'file_is_displayable_image' ) ) { + require_once ABSPATH . 'wp-admin/includes/image.php'; + } + + if ( ! \file_is_displayable_image( $file_path ) ) { + return new \WP_Error( 'not_displayable', \__( 'Image cannot be displayed.', 'activitypub' ) ); + } + + /* + * Method 3: Use WordPress's wp_check_filetype_and_ext for additional validation. + * MIME type restriction is already enforced by finfo in Method 1; this cross-checks + * that file content matches the declared type using WordPress defaults. + */ + $expected_ext = \wp_get_default_extension_for_mime_type( $mime ); + + // Use the detected extension since temp files from download_url() have a .tmp extension. + $file_name = \pathinfo( \wp_basename( $file_path ), PATHINFO_FILENAME ) . '.' . $expected_ext; + $file_info = \wp_check_filetype_and_ext( $file_path, $file_name ); + + // If WordPress couldn't validate the file type, reject it. + if ( empty( $file_info['type'] ) || ! \str_starts_with( $file_info['type'], 'image/' ) ) { + return new \WP_Error( 'invalid_file_type', \__( 'File type validation failed.', 'activitypub' ) ); + } + + // Method 4: Ensure file extension matches MIME type. + $ext = \pathinfo( $file_path, PATHINFO_EXTENSION ); + + if ( strtolower( $ext ) !== $expected_ext ) { + $new_path = \preg_replace( '/\.[^.]+$/', '.' . $expected_ext, $file_path ); + if ( empty( $new_path ) || $new_path === $file_path ) { + $new_path = $file_path . '.' . $expected_ext; + } + + if ( static::get_filesystem()->move( $file_path, $new_path, true ) ) { + return $new_path; + } + } + + return $file_path; + } + + /** + * Get the MIME type of a file. + * + * @param string $file_path Path to the file. + * + * @return string The MIME type. + */ + protected static function get_file_mime_type( $file_path ) { + if ( \extension_loaded( 'fileinfo' ) ) { + if ( null === self::$finfo ) { + self::$finfo = new \finfo( FILEINFO_MIME_TYPE ); + } + return self::$finfo->file( $file_path ); + } + + // Fallback to WordPress function. + return \wp_check_filetype( $file_path )['type'] ?? ''; + } + + /** + * Optimize an image file by resizing and converting to WebP. + * + * Uses WordPress image editor to resize large images and convert them + * to WebP format for better compression while maintaining quality. + * + * @param string $file_path Path to the image file. + * @param int $max_dimension Maximum width/height in pixels. + * + * @return string The optimized file path. + */ + protected static function optimize_image( $file_path, $max_dimension ) { + // Check if it's an image. + $mime_type = static::get_file_mime_type( $file_path ); + if ( ! $mime_type || ! \str_starts_with( $mime_type, 'image/' ) ) { + return $file_path; + } + + $editor = \wp_get_image_editor( $file_path ); + if ( \is_wp_error( $editor ) ) { + return $file_path; + } + + $size = $editor->get_size(); + $needs_resize = $size['width'] > $max_dimension || $size['height'] > $max_dimension; + + // Resize if needed. + if ( $needs_resize ) { + $editor->resize( $max_dimension, $max_dimension, false ); + } + + // Check if WebP is supported. + $can_webp = $editor->supports_mime_type( 'image/webp' ); + + // Determine output format and save. + $dir = \dirname( $file_path ); + + if ( $can_webp ) { + // Convert to WebP. + $new_name = \wp_unique_filename( $dir, \preg_replace( '/\.[^.]+$/', '.webp', \basename( $file_path ) ) ); + $result = $editor->save( $dir . '/' . $new_name, 'image/webp' ); + } elseif ( \in_array( $mime_type, array( 'image/png', 'image/webp' ), true ) ) { + // Keep original format for potentially transparent images when WebP not available. + if ( ! $needs_resize ) { + return $file_path; + } + $result = $editor->save( $file_path ); + } else { + // Convert to JPEG when WebP not available. + $new_name = \wp_unique_filename( $dir, \preg_replace( '/\.[^.]+$/', '.jpg', \basename( $file_path ) ) ); + $result = $editor->save( $dir . '/' . $new_name, 'image/jpeg' ); + } + + if ( \is_wp_error( $result ) ) { + return $file_path; + } + + // Handle result. + $result_path = $result['path'] ?? $file_path; + + // If path changed (format conversion), delete the original file. + if ( $result_path !== $file_path ) { + \wp_delete_file( $file_path ); + } + + return $result_path; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-media.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-media.php new file mode 100644 index 00000000..e314f98c --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-media.php @@ -0,0 +1,191 @@ + $upload_dir['basedir'] . $base_dir . $entity_id, + 'baseurl' => $upload_dir['baseurl'] . $base_dir . $entity_id, + ); + } + + /** + * Initialize the cache handler. + */ + public static function init() { + // Only register local caching filter when caching is enabled. + if ( self::is_enabled() ) { + \add_filter( 'activitypub_remote_media_url', array( self::class, 'maybe_cache' ), 10, 4 ); + + // Clean up when post is deleted. + \add_action( 'before_delete_post', array( self::class, 'maybe_cleanup' ) ); + } + } + + /** + * Maybe cache a media URL. + * + * Hooked to the activitypub_remote_media_url filter. + * Downloads and caches the file locally if not already cached. + * + * @param string $url The remote URL. + * @param string $context The context ('avatar', 'media', 'emoji', etc.). + * @param string|int $entity_id The entity identifier (post ID). + * @param array $options Optional. Additional options. + * + * @return string The local URL if cached successfully, otherwise the original URL. + */ + public static function maybe_cache( $url, $context, $entity_id = null, $options = array() ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Required for filter signature. + if ( self::CONTEXT !== $context || empty( $url ) || empty( $entity_id ) ) { + return $url; + } + + $cached_url = self::get_or_cache( $url, $entity_id ); + + return $cached_url ?: $url; + } + + /** + * Maybe clean up cached media when post is deleted. + * + * @param int $post_id The post ID being deleted. + */ + public static function maybe_cleanup( $post_id ) { + if ( Remote_Posts::POST_TYPE !== \get_post_type( $post_id ) ) { + return; + } + + self::invalidate_entity( $post_id ); + } + + /** + * Invalidate cached media for a comment. + * + * @param int $comment_id The comment ID. + * + * @return bool True on success, false on failure. + */ + public static function invalidate_comment( $comment_id ) { + $paths = self::get_storage_paths_for_context( $comment_id, self::CONTEXT_COMMENT ); + + return static::delete_directory( $paths['basedir'] ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-stats-image.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-stats-image.php new file mode 100644 index 00000000..1d26b68d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/cache/class-stats-image.php @@ -0,0 +1,684 @@ + 501 ) ); + } + + // If local caching is disabled, use the REST endpoint for on-the-fly generation. + if ( ! static::is_enabled() ) { + $url = \get_rest_url( null, ACTIVITYPUB_REST_NAMESPACE . '/stats/image/' . $user_id . '/' . $year ); + + /** + * Filters the stats image URL. + * + * Can be used to route through a CDN or image proxy like Photon. + * + * @since 8.1.0 + * + * @param string $url The image URL. + * @param int $user_id The user ID. + * @param int $year The year. + */ + return \apply_filters( 'activitypub_stats_image_url', $url, $user_id, $year ); + } + + $hash = self::get_hash( $user_id, $year ); + $paths = static::get_storage_paths( $user_id ); + + // Check for cached file using the base class glob pattern. + $pattern = static::escape_glob_pattern( $paths['basedir'] . '/stats-' . $year . '-' . $hash ) . '.*'; + $matches = \glob( $pattern ); + + if ( ! empty( $matches ) && \is_file( $matches[0] ) ) { + $url = $paths['baseurl'] . '/' . \basename( $matches[0] ); + + /** This filter is documented in includes/cache/class-stats-image.php */ + return \apply_filters( 'activitypub_stats_image_url', $url, $user_id, $year ); + } + + // Generate the image. + $result = self::generate( $user_id, $year ); + + if ( \is_wp_error( $result ) ) { + return $result; + } + + $url = $paths['baseurl'] . '/' . \basename( $result ); + + /** This filter is documented in includes/cache/class-stats-image.php */ + return \apply_filters( 'activitypub_stats_image_url', $url, $user_id, $year ); + } + + /** + * Serve a stats image, generating it if needed. + * + * Outputs headers and image data, then exits. + * + * @param int $user_id The user ID. + * @param int $year The year. + * + * @return \WP_Error|void Error on failure, exits on success. + */ + public static function serve( $user_id, $year ) { + if ( ! self::is_available() ) { + return new \WP_Error( 'gd_not_available', \__( 'GD library is not available.', 'activitypub' ), array( 'status' => 501 ) ); + } + + $hash = self::get_hash( $user_id, $year ); + $paths = static::get_storage_paths( $user_id ); + + // Check for cached file. + $pattern = static::escape_glob_pattern( $paths['basedir'] . '/stats-' . $year . '-' . $hash ) . '.*'; + $matches = \glob( $pattern ); + $file = ( ! empty( $matches ) && \is_file( $matches[0] ) ) ? $matches[0] : null; + + if ( ! $file ) { + $file = self::generate( $user_id, $year ); + } + + if ( \is_wp_error( $file ) ) { + return $file; + } + + $mime_type = static::get_file_mime_type( $file ); + + \header( 'Content-Type: ' . ( $mime_type ?: 'image/png' ) ); + \header( 'Content-Length: ' . \filesize( $file ) ); + \header( 'Cache-Control: public, max-age=86400' ); + \header( 'X-Content-Type-Options: nosniff' ); + + \readfile( $file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_readfile + exit; + } + + /** + * Generate the stats image and save to cache. + * + * @param int $user_id The user ID. + * @param int $year The year. + * + * @return string|\WP_Error Cached file path or error. + */ + public static function generate( $user_id, $year ) { + if ( ! self::is_available() ) { + return new \WP_Error( 'gd_not_available', \__( 'GD library is not available.', 'activitypub' ), array( 'status' => 501 ) ); + } + + $summary = Statistics::get_annual_summary( $user_id, $year ); + + if ( ! $summary ) { + $summary = Statistics::compile_annual_summary( $user_id, $year ); + } + + if ( ! $summary || empty( $summary['posts_count'] ) ) { + return new \WP_Error( 'no_stats', \__( 'No statistics available for this period.', 'activitypub' ), array( 'status' => 404 ) ); + } + + $actor = Actors::get_by_id( $user_id ); + + if ( \is_wp_error( $actor ) ) { + if ( Actors::BLOG_USER_ID === $user_id ) { + $actor = new Blog(); + } elseif ( Actors::APPLICATION_USER_ID === $user_id ) { + $actor = new Application(); + } + } + + $actor_webfinger = ! \is_wp_error( $actor ) ? $actor->get_webfinger() : ''; + $site_name = \get_bloginfo( 'name' ); + + if ( ! \function_exists( 'wp_tempnam' ) ) { + require_once ABSPATH . 'wp-admin/includes/file.php'; + } + + $tmp_file = self::render( $summary, $actor_webfinger, $site_name, $year ); + + if ( \is_wp_error( $tmp_file ) ) { + return $tmp_file; + } + + // Use the base class storage paths and optimization. + $paths = static::get_storage_paths( $user_id ); + + if ( ! \wp_mkdir_p( $paths['basedir'] ) ) { + \wp_delete_file( $tmp_file ); + return new \WP_Error( 'cache_dir_failed', \__( 'Failed to create cache directory.', 'activitypub' ), array( 'status' => 500 ) ); + } + + // Remove old cached images for this year before saving the new one. + $old_files = \glob( static::escape_glob_pattern( $paths['basedir'] . '/stats-' . $year . '-' ) . '*.*' ); + if ( $old_files ) { + foreach ( $old_files as $old_file ) { + \wp_delete_file( $old_file ); + } + } + + $hash = self::get_hash( $user_id, $year ); + $dest_name = \sprintf( 'stats-%d-%s.png', $year, $hash ); + $dest_path = $paths['basedir'] . '/' . $dest_name; + + static::get_filesystem()->move( $tmp_file, $dest_path, true ); + + // Keep as PNG for maximum compatibility when sharing on social networks. + return $dest_path; + } + + /** + * Generate a hash for cache invalidation. + * + * Includes the theme stylesheet, version, and stats compilation + * timestamp so cached images are regenerated when the theme or + * the underlying stats data changes. + * + * @param int $user_id The user ID. + * @param int $year The year. + * + * @return string The hash string. + */ + private static function get_hash( $user_id = 0, $year = 0 ) { + $parts = array( + \get_stylesheet(), + \wp_get_theme()->get( 'Version' ), + ); + + if ( $user_id && $year ) { + $summary = Statistics::get_annual_summary( $user_id, $year ); + + if ( $summary && ! empty( $summary['compiled_at'] ) ) { + $parts[] = $summary['compiled_at']; + } + } + + return \md5( \wp_json_encode( $parts ) ); + } + + /** + * Render the stats image as a temporary PNG file. + * + * @param array $summary The annual stats summary. + * @param string $actor_webfinger The actor webfinger identifier. + * @param string $site_name The site name. + * @param int $year The year. + * @return string|\WP_Error Path to temporary PNG file or error. + */ + private static function render( $summary, $actor_webfinger, $site_name, $year ) { + $width = self::WIDTH; + $height = self::HEIGHT; + + $image = \imagecreatetruecolor( $width, $height ); + + if ( ! $image ) { + return new \WP_Error( 'image_create_failed', \__( 'Failed to create image.', 'activitypub' ), array( 'status' => 500 ) ); + } + + \imageantialias( $image, true ); + + $colors = self::resolve_colors(); + $bg = \imagecolorallocate( $image, $colors['bg'][0], $colors['bg'][1], $colors['bg'][2] ); + $fg = \imagecolorallocate( $image, $colors['fg'][0], $colors['fg'][1], $colors['fg'][2] ); + $muted = \imagecolorallocate( $image, $colors['muted'][0], $colors['muted'][1], $colors['muted'][2] ); + + \imagefill( $image, 0, 0, $bg ); + + $font = self::resolve_font(); + + // Total engagement. + $comment_types = Statistics::get_comment_types_for_stats(); + $total_engagement = 0; + foreach ( \array_keys( $comment_types ) as $slug ) { + $total_engagement += $summary[ $slug . '_count' ] ?? 0; + } + + // Title. + $title = \sprintf( + /* translators: %d: The year */ + \__( 'Fediverse Stats %d', 'activitypub' ), + $year + ); + self::draw_text( $image, $title, null, 100, 36, $fg, $font ); + + // Actor webfinger. + if ( $actor_webfinger ) { + self::draw_text( $image, $actor_webfinger, null, 150, 20, $muted, $font ); + } + + // Three big stats in a row. + $stats = array( + array( + 'value' => \number_format_i18n( $summary['posts_count'] ), + 'label' => \__( 'Posts', 'activitypub' ), + ), + array( + 'value' => \number_format_i18n( $total_engagement ), + 'label' => \__( 'Engagements', 'activitypub' ), + ), + array( + 'value' => \number_format_i18n( $summary['followers_end'] ?? 0 ), + 'label' => \__( 'Followers', 'activitypub' ), + ), + ); + + $col_width = (int) ( $width / 3 ); + + foreach ( $stats as $i => $stat ) { + $center_x = (int) ( $col_width * $i + $col_width / 2 ); + self::draw_text( $image, $stat['value'], $center_x, 300, 56, $fg, $font ); + self::draw_text( $image, $stat['label'], $center_x, 355, 18, $muted, $font ); + } + + // Follower growth line. + $followers_net = $summary['followers_net_change'] ?? 0; + $change_sign = $followers_net >= 0 ? '+' : ''; + $growth_text = \sprintf( + /* translators: %s: follower net change */ + \__( '%s followers this year', 'activitypub' ), + $change_sign . \number_format_i18n( $followers_net ) + ); + self::draw_text( $image, $growth_text, null, 450, 20, $muted, $font ); + + // Branding. + $branding = $site_name . ' - ' . \__( 'Powered by ActivityPub', 'activitypub' ); + self::draw_text( $image, $branding, null, $height - 40, 14, $muted, $font ); + + // Save to temp file. + $tmp_file = \wp_tempnam( 'activitypub-stats-' ); + + if ( ! $tmp_file ) { + return new \WP_Error( 'temp_file_failed', \__( 'Could not create temporary file.', 'activitypub' ), array( 'status' => 500 ) ); + } + + $saved = \imagepng( $image, $tmp_file ); + + // imagedestroy() is deprecated since PHP 8.5 and a no-op since 8.0. + if ( \PHP_VERSION_ID < 80000 ) { + \imagedestroy( $image ); + } + + if ( ! $saved ) { + \wp_delete_file( $tmp_file ); + return new \WP_Error( 'image_write_failed', \__( 'Failed to write stats image.', 'activitypub' ), array( 'status' => 500 ) ); + } + + return $tmp_file; + } + + /** + * Draw text on the image, centered on the canvas or at a specific x position. + * + * Uses TrueType rendering when a font is available, falls back to + * GD built-in fonts. + * + * @param resource $image The image resource. + * @param string $text The text to draw. + * @param int|null $x The center x position, or null to center on canvas. + * @param int $y The y position. + * @param int|float $size Font size in points (TTF) or 1-5 (built-in). + * @param int $color The text color. + * @param string|false $font Path to TTF file, or false for built-in. + */ + private static function draw_text( $image, $text, $x, $y, $size, $color, $font = false ) { + if ( $font && \function_exists( 'imagefttext' ) ) { + $bbox = \imageftbbox( $size, 0, $font, $text ); + $text_width = $bbox[2] - $bbox[0]; + $draw_x = null === $x + ? (int) ( ( self::WIDTH - $text_width ) / 2 ) + : (int) ( $x - $text_width / 2 ); + \imagefttext( $image, $size, 0, $draw_x, $y, $color, $font, $text ); + } else { + $builtin_size = \min( 5, \max( 1, (int) ( $size / 10 ) ) ); + $font_width = \imagefontwidth( $builtin_size ); + $text_width = $font_width * \strlen( $text ); + $draw_x = null === $x + ? (int) ( ( self::WIDTH - $text_width ) / 2 ) + : (int) ( $x - $text_width / 2 ); + \imagestring( $image, $builtin_size, $draw_x, $y, $text, $color ); + } + } + + /** + * Resolve colors from theme Global Styles or overrides. + * + * @return array Associative array with 'bg', 'fg', and 'muted' RGB arrays. + */ + private static function resolve_colors() { + $bg_rgb = array( 255, 255, 255 ); + $fg_rgb = array( 17, 17, 17 ); + + $palette = array(); + $settings = \wp_get_global_settings(); + if ( ! empty( $settings['color']['palette'] ) ) { + foreach ( $settings['color']['palette'] as $colors ) { + foreach ( $colors as $color ) { + $palette[ $color['slug'] ] = $color['color']; + } + } + } + + $styles = \wp_get_global_styles( array( 'color' ) ); + $bg_resolved = self::resolve_style_color( $styles['background'] ?? '', $palette ); + $fg_resolved = self::resolve_style_color( $styles['text'] ?? '', $palette ); + + if ( $bg_resolved ) { + $bg_rgb = $bg_resolved; + } + + if ( $fg_resolved ) { + $fg_rgb = $fg_resolved; + } + + if ( ! $bg_resolved || ! $fg_resolved ) { + $bg_slugs = array( 'base', 'background', 'white' ); + $fg_slugs = array( 'contrast', 'foreground', 'black', 'dark-gray' ); + + if ( ! $bg_resolved ) { + foreach ( $bg_slugs as $slug ) { + if ( ! empty( $palette[ $slug ] ) ) { + $parsed = self::parse_hex( $palette[ $slug ] ); + if ( $parsed ) { + $bg_rgb = $parsed; + break; + } + } + } + } + + if ( ! $fg_resolved ) { + foreach ( $fg_slugs as $slug ) { + if ( ! empty( $palette[ $slug ] ) ) { + $parsed = self::parse_hex( $palette[ $slug ] ); + if ( $parsed ) { + $fg_rgb = $parsed; + break; + } + } + } + } + } + + return self::build_color_set( $bg_rgb, $fg_rgb ); + } + + /** + * Build a color set with a derived muted color. + * + * @param array $bg_rgb Background RGB. + * @param array $fg_rgb Foreground RGB. + * + * @return array { bg, fg, muted } RGB arrays. + */ + private static function build_color_set( $bg_rgb, $fg_rgb ) { + return array( + 'bg' => $bg_rgb, + 'fg' => $fg_rgb, + 'muted' => array( + (int) ( ( $fg_rgb[0] + $bg_rgb[0] ) / 2 ), + (int) ( ( $fg_rgb[1] + $bg_rgb[1] ) / 2 ), + (int) ( ( $fg_rgb[2] + $bg_rgb[2] ) / 2 ), + ), + ); + } + + /** + * Resolve a color value from Global Styles. + * + * @param string $value The color value (hex or CSS variable). + * @param array $palette The merged color palette (slug => hex). + * + * @return array|false RGB array or false. + */ + private static function resolve_style_color( $value, $palette ) { + if ( empty( $value ) ) { + return false; + } + + if ( '#' === $value[0] ) { + return self::parse_hex( $value ); + } + + if ( \preg_match( '/--color--([a-z0-9-]+)/', $value, $matches ) ) { + if ( ! empty( $palette[ $matches[1] ] ) ) { + return self::parse_hex( $palette[ $matches[1] ] ); + } + } + + return false; + } + + /** + * Parse a hex color string into an RGB array. + * + * @param string $hex The hex color (e.g. '#FF0000' or '#F00'). + * + * @return array|false Array of [r, g, b] or false on failure. + */ + private static function parse_hex( $hex ) { + $hex = \ltrim( $hex, '#' ); + + if ( 3 === \strlen( $hex ) ) { + $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2]; + } + + if ( 6 !== \strlen( $hex ) ) { + return false; + } + + $result = \sscanf( $hex, '%02x%02x%02x' ); + + return ( 3 === \count( $result ) ) ? $result : false; + } + + /** + * Resolve a TTF font file from the active theme or Font Library. + * + * @return string|false Path to a TTF file, or false if none found. + */ + private static function resolve_font() { + $body_slug = ''; + $styles = \wp_get_global_styles( array( 'typography' ) ); + if ( ! empty( $styles['fontFamily'] ) && \preg_match( '/--font-family--([a-z0-9-]+)/', $styles['fontFamily'], $matches ) ) { + $body_slug = $matches[1]; + } + + $settings = \wp_get_global_settings(); + if ( ! empty( $settings['typography']['fontFamilies'] ) ) { + $all_families = array(); + foreach ( $settings['typography']['fontFamilies'] as $families ) { + foreach ( $families as $family ) { + $all_families[] = $family; + } + } + + // Sort so the body font family is tried first. + if ( $body_slug ) { + \usort( + $all_families, + function ( $a, $b ) use ( $body_slug ) { + return ( ( $a['slug'] ?? '' ) === $body_slug ? 0 : 1 ) - ( ( $b['slug'] ?? '' ) === $body_slug ? 0 : 1 ); + } + ); + } + + $font = self::find_ttf_in_families( $all_families ); + if ( $font ) { + return $font; + } + } + + // Try the Font Library (WP 6.5+). + $font = self::find_ttf_in_font_library(); + if ( $font ) { + return $font; + } + + return false; + } + + /** + * Find a TTF/OTF file in font family definitions. + * + * @param array $families The font families to search. + * + * @return string|false Path to TTF file or false. + */ + private static function find_ttf_in_families( $families ) { + $theme_dir = \get_theme_root(); + + foreach ( $families as $family ) { + if ( empty( $family['fontFace'] ) ) { + continue; + } + foreach ( $family['fontFace'] as $face ) { + $src = \is_array( $face['src'] ) ? $face['src'][0] : $face['src']; + + if ( ! \preg_match( '/\.(ttf|otf)$/i', $src ) ) { + continue; + } + + // Resolve theme-relative paths. + if ( 0 === \strpos( $src, 'file:./' ) ) { + $src = \get_theme_file_path( \substr( $src, 7 ) ); + } + + // Only allow fonts within the themes directory for security. + $real_path = \realpath( $src ); + if ( ! $real_path || 0 !== \strpos( $real_path, \realpath( $theme_dir ) ) ) { + continue; + } + + return $real_path; + } + } + + return false; + } + + /** + * Find a TTF/OTF file from the WordPress Font Library. + * + * @return string|false Path to TTF file or false. + */ + private static function find_ttf_in_font_library() { + $font_families = \get_posts( + array( + 'post_type' => 'wp_font_family', + 'posts_per_page' => 10, + 'post_status' => 'publish', + ) + ); + + foreach ( $font_families as $font_family ) { + $faces = \get_posts( + array( + 'post_type' => 'wp_font_face', + 'post_parent' => $font_family->ID, + 'posts_per_page' => 10, + 'post_status' => 'publish', + ) + ); + + foreach ( $faces as $face ) { + $file = \get_post_meta( $face->ID, '_wp_font_face_file', true ); + if ( $file && \preg_match( '/\.(ttf|otf)$/i', $file ) ) { + $path = \path_join( \wp_get_font_dir()['path'], $file ); + if ( \file_exists( $path ) ) { + return $path; + } + } + } + } + + return false; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-activitypub.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-activitypub.php new file mode 100644 index 00000000..2583328c --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-activitypub.php @@ -0,0 +1,400 @@ + 'ids' ) ); + foreach ( $sites as $site ) { + \switch_to_blog( $site ); + self::flush_rewrite_rules(); + \restore_current_blog(); + } + } + } + + /** + * Deactivation Hook. + * + * @param bool $network_wide Whether to deactivate the plugin for all sites in the network or just the current site. + */ + public static function deactivate( $network_wide ) { + self::flush_rewrite_rules(); + Scheduler::deregister_schedules(); + + \remove_filter( 'pre_wp_update_comment_count_now', array( Comment::class, 'pre_wp_update_comment_count_now' ), 5 ); + Migration::update_comment_counts( 2000 ); + + if ( \is_multisite() && $network_wide && ! \wp_is_large_network() ) { + $sites = \get_sites( array( 'fields' => 'ids' ) ); + foreach ( $sites as $site ) { + \switch_to_blog( $site ); + self::flush_rewrite_rules(); + \restore_current_blog(); + } + } + } + + /** + * Uninstall Hook. + */ + public static function uninstall() { + Scheduler::deregister_schedules(); + + \remove_filter( 'pre_wp_update_comment_count_now', array( Comment::class, 'pre_wp_update_comment_count_now' ), 5 ); + Migration::update_comment_counts( 2000 ); + + Remote_Posts::delete_all(); + Tombstone::delete_all(); + Client::delete_all(); + + Options::delete(); + } + + /** + * Store permalink in meta, to send delete Activity. + * + * @param string $post_id The Post ID. + */ + public static function trash_post( $post_id ) { + \add_post_meta( + $post_id, + '_activitypub_canonical_url', + \get_permalink( $post_id ), + true + ); + } + + /** + * Delete permalink from meta. + * + * @param string $post_id The Post ID. + */ + public static function untrash_post( $post_id ) { + \delete_post_meta( $post_id, '_activitypub_canonical_url' ); + } + + /** + * Flush rewrite rules. + */ + public static function flush_rewrite_rules() { + Router::add_rewrite_rules(); + \flush_rewrite_rules(); + } + + /** + * Add rewrite rules. + * + * @deprecated 7.5.0 Use {@see Router::add_rewrite_rules()}. + */ + public static function add_rewrite_rules() { + _deprecated_function( __FUNCTION__, '7.5.0', '\Activitypub\Router::add_rewrite_rules()' ); + + Router::add_rewrite_rules(); + } + + /** + * Theme compatibility stuff. + */ + public static function theme_compat() { + // We assume that you want to use Post-Formats when enabling the setting. + if ( 'wordpress-post-format' === \get_option( 'activitypub_object_type', ACTIVITYPUB_DEFAULT_OBJECT_TYPE ) ) { + if ( ! get_theme_support( 'post-formats' ) ) { + // Add support for the Aside, Gallery Post Formats... + add_theme_support( + 'post-formats', + array( + 'gallery', + 'status', + 'image', + 'video', + 'audio', + ) + ); + } + } + } + + /** + * Add the 'activitypub' capability to users who can publish posts. + * + * @param int $user_id User ID. + */ + public static function user_register( $user_id ) { + if ( \user_can( $user_id, 'publish_posts' ) ) { + $user = \get_user_by( 'id', $user_id ); + $user->add_cap( 'activitypub' ); + } + } + + /** + * Register user meta. + */ + public static function register_user_meta() { + $blog_prefix = $GLOBALS['wpdb']->get_blog_prefix(); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_also_known_as', + array( + 'type' => 'array', + 'description' => 'An array of URLs that the user is known by.', + 'single' => true, + 'default' => array(), + 'sanitize_callback' => array( Sanitize::class, 'identifier_list' ), + ) + ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_hide_social_graph', + array( + 'type' => 'integer', + 'description' => 'Hide Followers and Followings on Profile.', + 'single' => true, + 'default' => 0, + 'sanitize_callback' => 'absint', + 'show_in_rest' => true, + ) + ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_old_host_data', + array( + 'description' => 'Actor object for the user on the old host.', + 'single' => true, + ) + ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_moved_to', + array( + 'type' => 'string', + 'description' => 'The new URL of the user.', + 'single' => true, + 'sanitize_callback' => 'sanitize_url', + ) + ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_description', + array( + 'type' => 'string', + 'description' => 'The user description.', + 'single' => true, + 'default' => '', + 'sanitize_callback' => static function ( $value ) { + return wp_kses( $value, 'user_description' ); + }, + ) + ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_icon', + array( + 'type' => 'integer', + 'description' => 'The attachment ID for user profile image.', + 'single' => true, + 'default' => 0, + 'sanitize_callback' => 'absint', + ) + ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_header_image', + array( + 'type' => 'integer', + 'description' => 'The attachment ID for the user header image.', + 'single' => true, + 'default' => 0, + 'sanitize_callback' => 'absint', + ) + ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_mailer_new_dm', + array( + 'type' => 'integer', + 'description' => 'Send a notification when someone sends this user a direct message.', + 'single' => true, + 'sanitize_callback' => 'absint', + ) + ); + \add_filter( 'get_user_option_activitypub_mailer_new_dm', array( self::class, 'user_options_default' ) ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_mailer_new_follower', + array( + 'type' => 'integer', + 'description' => 'Send a notification when someone starts to follow this user.', + 'single' => true, + 'sanitize_callback' => 'absint', + ) + ); + \add_filter( 'get_user_option_activitypub_mailer_new_follower', array( self::class, 'user_options_default' ) ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_mailer_new_mention', + array( + 'type' => 'integer', + 'description' => 'Send a notification when someone mentions this user.', + 'single' => true, + 'sanitize_callback' => 'absint', + ) + ); + \add_filter( 'get_user_option_activitypub_mailer_new_mention', array( self::class, 'user_options_default' ) ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_mailer_annual_report', + array( + 'type' => 'integer', + 'description' => 'Send the annual Fediverse Year in Review email.', + 'single' => true, + 'sanitize_callback' => 'absint', + ) + ); + \add_filter( 'get_user_option_activitypub_mailer_annual_report', array( self::class, 'user_options_default' ) ); + + \register_meta( + 'user', + $blog_prefix . 'activitypub_mailer_monthly_report', + array( + 'type' => 'integer', + 'description' => 'Send a monthly Fediverse stats report email.', + 'single' => true, + 'sanitize_callback' => 'absint', + ) + ); + + \register_meta( + 'user', + 'activitypub_show_welcome_tab', + array( + 'type' => 'integer', + 'description' => 'Whether to show the welcome tab.', + 'single' => true, + 'default' => 1, + 'sanitize_callback' => 'absint', + ) + ); + + \register_meta( + 'user', + 'activitypub_show_advanced_tab', + array( + 'type' => 'integer', + 'description' => 'Whether to show the advanced tab.', + 'single' => true, + 'default' => 0, + 'sanitize_callback' => 'absint', + ) + ); + + // Moderation user meta. + \register_meta( + 'user', + 'activitypub_blocked_actors', + array( + 'type' => 'array', + 'description' => 'User-specific blocked ActivityPub actors.', + 'single' => true, + 'default' => array(), + 'sanitize_callback' => array( Sanitize::class, 'identifier_list' ), + ) + ); + + \register_meta( + 'user', + 'activitypub_blocked_domains', + array( + 'type' => 'array', + 'description' => 'User-specific blocked ActivityPub domains.', + 'single' => true, + 'default' => array(), + 'sanitize_callback' => static function ( $value ) { + return \array_unique( \array_map( array( Sanitize::class, 'host_list' ), $value ) ); + }, + ) + ); + + \register_meta( + 'user', + 'activitypub_blocked_keywords', + array( + 'type' => 'array', + 'description' => 'User-specific blocked ActivityPub keywords.', + 'single' => true, + 'default' => array(), + 'sanitize_callback' => static function ( $value ) { + return \array_map( 'sanitize_text_field', $value ); + }, + ) + ); + } + + /** + * Set default values for user options. + * + * @param bool|string $value Option value. + * @return bool|string + */ + public static function user_options_default( $value ) { + if ( false === $value ) { + return '1'; + } + + return $value; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-attachments.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-attachments.php new file mode 100644 index 00000000..0bfe805a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-attachments.php @@ -0,0 +1,759 @@ +ID, '_source_url', true ) === $source_url ) { + return $attachment->ID; + } + } + + return false; + } + + /** + * Process inline images from post content. + * + * @param int $post_id The post ID. + * @param int $author_id Optional. User ID to set as attachment author. Default 0. + * + * @return array Array of URL mappings (old URL => new URL). + */ + private static function import_inline_images( $post_id, $author_id = 0 ) { + $post = \get_post( $post_id ); + if ( ! $post || empty( $post->post_content ) ) { + return array(); + } + + // Find all img tags in the content. + preg_match_all( '/]+src=["\']([^"\']+)["\'][^>]*>/i', $post->post_content, $matches ); + + if ( empty( $matches[1] ) ) { + return array(); + } + + $url_mappings = array(); + $content = $post->post_content; + + foreach ( $matches[1] as $image_url ) { + // Skip if already processed or is a local URL. + if ( isset( $url_mappings[ $image_url ] ) ) { + continue; + } + + // Check if this image was already processed as an attachment. + $attachment_id = self::get_existing_attachment( $image_url, $post_id ); + if ( ! $attachment_id ) { + $attachment_id = self::save_attachment( array( 'url' => $image_url ), $post_id, $author_id ); + + if ( \is_wp_error( $attachment_id ) ) { + continue; + } + } + + $new_url = \wp_get_attachment_url( $attachment_id ); + if ( $new_url ) { + $url_mappings[ $image_url ] = $new_url; + $content = \str_replace( $image_url, $new_url, $content ); + } + } + + // Update post content if URLs were replaced. + if ( ! empty( $url_mappings ) ) { + \wp_update_post( + array( + 'ID' => $post_id, + 'post_content' => $content, + ) + ); + } + + return $url_mappings; + } + + /** + * Normalize an ActivityPub attachment object to a standard format. + * + * @param mixed $attachment The attachment data (array or object). + * + * @return array|false Normalized attachment data or false on failure. + */ + private static function normalize_attachment( $attachment ) { + // Convert object to array if needed. + if ( \is_object( $attachment ) ) { + $attachment = \get_object_vars( $attachment ); + } + + if ( ! is_array( $attachment ) || empty( $attachment['url'] ) ) { + return false; + } + + return array( + 'url' => $attachment['url'], + 'mediaType' => $attachment['mediaType'] ?? '', + 'name' => $attachment['name'] ?? '', + 'type' => $attachment['type'] ?? 'Document', + ); + } + + /** + * Save an attachment (local file or remote URL) to the media library. + * + * @param array $attachment_data The normalized attachment data. + * @param int $post_id The post ID to attach to. + * @param int $author_id Optional. User ID to set as attachment author. Default 0. + * + * @return int|\WP_Error The attachment ID or WP_Error on failure. + */ + private static function save_attachment( $attachment_data, $post_id, $author_id = 0 ) { + // Ensure required WordPress functions are loaded. + if ( ! \function_exists( 'media_handle_sideload' ) || ! \function_exists( 'download_url' ) ) { + require_once ABSPATH . 'wp-admin/includes/media.php'; + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/image.php'; + } + + // Use WP_Filesystem_Direct explicitly to avoid FTP fallback from WP_Filesystem(). + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php'; + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php'; + + $filesystem = new \WP_Filesystem_Direct( null ); + + $is_local = ! preg_match( '#^https?://#i', $attachment_data['url'] ); + + if ( $is_local ) { + // Validate local path is within allowed directories to prevent file disclosure. + $allowed = self::is_allowed_local_path( $attachment_data['url'] ); + if ( ! $allowed ) { + return new \WP_Error( 'invalid_path', \__( 'Local file path is not within allowed directories.', 'activitypub' ) ); + } + + // Read local file from disk. + if ( ! $filesystem->exists( $attachment_data['url'] ) ) { + /* translators: %s: file path */ + return new \WP_Error( 'file_not_found', sprintf( \__( 'File not found: %s', 'activitypub' ), $attachment_data['url'] ) ); + } + + // Copy to temp file so media_handle_sideload doesn't move the original. + $tmp_file = \wp_tempnam( \basename( $attachment_data['url'] ) ); + $filesystem->copy( $attachment_data['url'], $tmp_file, true ); + } else { + // Validate remote URL before downloading. + if ( ! \wp_http_validate_url( $attachment_data['url'] ) ) { + return new \WP_Error( 'invalid_url', \__( 'URL is not allowed.', 'activitypub' ) ); + } + + // Download remote URL. + $tmp_file = \download_url( $attachment_data['url'] ); + + if ( \is_wp_error( $tmp_file ) ) { + return $tmp_file; + } + } + + // Get original filename from URL. + $original_name = \basename( \wp_parse_url( $attachment_data['url'], PHP_URL_PATH ) ); + + // Rename temp file to have proper extension for optimize_image to detect mime type. + $original_ext = \pathinfo( $original_name, PATHINFO_EXTENSION ); + if ( $original_ext ) { + $renamed_tmp = $tmp_file . '.' . $original_ext; + if ( $filesystem->move( $tmp_file, $renamed_tmp, true ) ) { + $tmp_file = $renamed_tmp; + } + } + + // Optimize images before sideloading (resize and convert to WebP). + $tmp_file = self::optimize_image( $tmp_file, self::MAX_IMAGE_DIMENSION ); + + // Update filename extension to match optimized file. + $new_ext = \pathinfo( $tmp_file, PATHINFO_EXTENSION ); + if ( $new_ext ) { + $original_name = \preg_replace( '/\.[^.]+$/', '.' . $new_ext, $original_name ); + } + + $file_array = array( + 'name' => $original_name, + 'tmp_name' => $tmp_file, + ); + + // Prepare attachment post data. + // Let WordPress auto-detect the mime type from the file. + $post_data = array( + 'post_title' => $attachment_data['name'] ?? '', + 'post_content' => $attachment_data['name'] ?? '', + 'post_author' => $author_id, + 'meta_input' => array( + '_source_url' => $attachment_data['url'], + ), + ); + + // Add alt text for images. + if ( ! empty( $attachment_data['name'] ) ) { + $original_mime = $attachment_data['mediaType'] ?? ''; + if ( 'image' === strtok( $original_mime, '/' ) ) { + $post_data['meta_input']['_wp_attachment_image_alt'] = $attachment_data['name']; + } + } + + // Sideload the attachment into WordPress. + $attachment_id = \media_handle_sideload( $file_array, $post_id, '', $post_data ); + + // Clean up temp file if there was an error. + if ( \is_wp_error( $attachment_id ) ) { + \wp_delete_file( $tmp_file ); + } + + return $attachment_id; + } + + /** + * Get a unique file path by appending a counter if the file already exists. + * + * @param string $file_path The desired file path. + * + * @return string A unique file path that doesn't exist. + */ + private static function get_unique_path( $file_path ) { + if ( ! \file_exists( $file_path ) ) { + return $file_path; + } + + $path_info = \pathinfo( $file_path ); + $dir = $path_info['dirname']; + $base_name = $path_info['filename']; + $extension = isset( $path_info['extension'] ) ? '.' . $path_info['extension'] : ''; + $counter = 1; + + do { + $new_path = $dir . '/' . $base_name . '-' . $counter . $extension; + ++$counter; + } while ( \file_exists( $new_path ) ); + + return $new_path; + } + + /** + * Check if a local file path is within allowed directories. + * + * Prevents arbitrary file access by restricting local paths to known safe + * directories like the uploads folder or WordPress temp directory. + * + * @param string $file_path The local file path to validate. + * + * @return bool True if the path is allowed, false otherwise. + */ + private static function is_allowed_local_path( $file_path ) { + // Normalize the path and resolve any relative components. + $real_path = \realpath( $file_path ); + if ( false === $real_path ) { + // If file doesn't exist yet, check the directory. + $dir_path = \realpath( \dirname( $file_path ) ); + if ( false === $dir_path ) { + return false; + } + $real_path = $dir_path . '/' . \basename( $file_path ); + } + + // Get allowed base directories. + $upload_dir = \wp_upload_dir(); + $allowed_dirs = array( + \realpath( $upload_dir['basedir'] ), + \realpath( \get_temp_dir() ), + \realpath( ABSPATH . 'wp-content' ), + ); + + /** + * Filters the allowed directories for local file imports. + * + * @since 5.6.0 + * + * @param string[] $allowed_dirs Array of allowed directory paths. + * @param string $file_path The file path being validated. + */ + $allowed_dirs = \apply_filters( 'activitypub_allowed_import_directories', $allowed_dirs, $file_path ); + + // Remove any false values from realpath failures. + $allowed_dirs = \array_filter( $allowed_dirs ); + + // Check if the file is within any allowed directory. + foreach ( $allowed_dirs as $allowed_dir ) { + if ( \str_starts_with( $real_path, $allowed_dir ) ) { + return true; + } + } + + return false; + } + + /** + * Optimize an image file by resizing and converting to WebP. + * + * Uses WordPress image editor to resize large images and convert them + * to WebP format for better compression while maintaining quality. + * + * @param string $file_path Path to the image file. + * @param int $max_dimension Maximum width/height in pixels. + * + * @return string The optimized file path. + */ + private static function optimize_image( $file_path, $max_dimension ) { + // Check if it's an image. + $mime_type = \wp_check_filetype( $file_path )['type'] ?? ''; + if ( ! $mime_type || ! \str_starts_with( $mime_type, 'image/' ) ) { + return $file_path; + } + + // Skip SVG and GIF files (GIFs may be animated). + if ( \in_array( $mime_type, array( 'image/svg+xml', 'image/gif' ), true ) ) { + return $file_path; + } + + $editor = \wp_get_image_editor( $file_path ); + if ( \is_wp_error( $editor ) ) { + return $file_path; + } + + $size = $editor->get_size(); + $needs_resize = $size['width'] > $max_dimension || $size['height'] > $max_dimension; + + // Resize if needed. + if ( $needs_resize ) { + $editor->resize( $max_dimension, $max_dimension, false ); + } + + // Check if WebP is supported. + $can_webp = $editor->supports_mime_type( 'image/webp' ); + + // Determine output format and save. + if ( $can_webp ) { + // Convert to WebP. + $new_path = self::get_unique_path( \preg_replace( '/\.[^.]+$/', '.webp', $file_path ) ); + $result = $editor->save( $new_path, 'image/webp' ); + } elseif ( \in_array( $mime_type, array( 'image/png', 'image/webp' ), true ) ) { + // Keep original format for potentially transparent images when WebP not available. + if ( ! $needs_resize ) { + // No changes needed. + return $file_path; + } + $result = $editor->save( $file_path ); + } else { + // Convert to JPEG when WebP not available. + $new_path = self::get_unique_path( \preg_replace( '/\.[^.]+$/', '.jpg', $file_path ) ); + $result = $editor->save( $new_path, 'image/jpeg' ); + } + + if ( \is_wp_error( $result ) ) { + return $file_path; + } + + // Handle result - $result is always an array from $editor->save(). + $result_path = $result['path'] ?? $file_path; + + // If path changed (format conversion), delete the original file. + if ( $result_path !== $file_path ) { + \wp_delete_file( $file_path ); + } + + return $result_path; + } + + /** + * Append media to post content. + * + * @param int $post_id The post ID. + * @param int[] $attachment_ids Array of attachment IDs. + */ + private static function append_media_to_post_content( $post_id, $attachment_ids ) { + $post = \get_post( $post_id ); + if ( ! $post ) { + return; + } + + $media = self::generate_media_markup( $attachment_ids ); + $separator = empty( trim( $post->post_content ) ) ? '' : "\n\n"; + + \wp_update_post( + array( + 'ID' => $post_id, + 'post_content' => $post->post_content . $separator . $media, + ) + ); + } + + /** + * Generate media markup for attachments. + * + * @param int[] $attachment_ids Array of attachment IDs. + * + * @return string The generated markup. + */ + private static function generate_media_markup( $attachment_ids ) { + if ( empty( $attachment_ids ) ) { + return ''; + } + + /** + * Filters the media markup for ActivityPub attachments. + * + * Allows plugins to provide custom markup for attachments. + * If this filter returns a non-empty string, it will be used instead of + * the default block markup. + * + * @param string $markup The custom markup. Default empty string. + * @param int[] $attachment_ids Array of attachment IDs. + */ + $custom_markup = \apply_filters( 'activitypub_attachments_media_markup', '', $attachment_ids ); + + if ( ! empty( $custom_markup ) ) { + return $custom_markup; + } + + // Default to block markup. + $type = strtok( \get_post_mime_type( $attachment_ids[0] ), '/' ); + + // Single video or audio file. + if ( 1 === \count( $attachment_ids ) && ( 'video' === $type || 'audio' === $type ) ) { + return sprintf( + '
<%1$s controls src="%3$s">
', + \esc_attr( $type ), + \esc_attr( $attachment_ids[0] ), + \esc_url( \wp_get_attachment_url( $attachment_ids[0] ) ) + ); + } + + // Single image: use standalone image block. + if ( 1 === \count( $attachment_ids ) && 'image' === $type ) { + return self::get_image_block( $attachment_ids[0] ); + } + + // Multiple attachments: use gallery block. + return self::get_gallery_block( $attachment_ids ); + } + + /** + * Get standalone image block markup. + * + * @param int $attachment_id The attachment ID. + * + * @return string The image block markup. + */ + private static function get_image_block( $attachment_id ) { + $image_src = \wp_get_attachment_image_src( $attachment_id, 'large' ); + if ( ! $image_src ) { + return ''; + } + + $alt = \get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ); + if ( ! $alt ) { + $alt = \get_post_field( 'post_excerpt', $attachment_id ); + } + + $block = '' . "\n"; + $block .= '
'; + $block .= '' . \esc_attr( $alt ) . ''; + $block .= '
' . "\n"; + $block .= ''; + + return $block; + } + + /** + * Get gallery block markup. + * + * @param int[] $attachment_ids The attachment IDs to use. + * + * @return string The gallery block markup. + */ + private static function get_gallery_block( $attachment_ids ) { + $gallery = '' . "\n"; + $gallery .= '\n"; + $gallery .= ''; + + return $gallery; + } + + /** + * Get content from an object based on its type. + * + * @param int $object_id The object ID (post or comment). + * @param string $object_type The object type ('post' or 'comment'). + * + * @return string The object content. + */ + private static function get_object_content( $object_id, $object_type ) { + if ( 'comment' === $object_type ) { + $comment = \get_comment( $object_id ); + return $comment ? $comment->comment_content : ''; + } + + return \get_post_field( 'post_content', $object_id ); + } + + /** + * Update content for an object based on its type. + * + * @param int $object_id The object ID (post or comment). + * @param string $object_type The object type ('post' or 'comment'). + * @param string $content The new content. + */ + private static function update_object_content( $object_id, $object_type, $content ) { + if ( 'comment' === $object_type ) { + \wp_update_comment( + array( + 'comment_ID' => $object_id, + 'comment_content' => $content, + ) + ); + } else { + \wp_update_post( + array( + 'ID' => $object_id, + 'post_content' => $content, + ) + ); + } + } + + /** + * Append file-based media markup to an object's content. + * + * Used for cached remote media (via Cache classes) that doesn't go through + * the Media Library. Works with posts and comments. + * + * @param int $object_id The object ID (post or comment). + * @param array $files Array of file data arrays with 'url', 'mime_type', and 'alt' keys. + * @param string $object_type The object type ('post' or 'comment'). + */ + public static function append_files_to_content( $object_id, $files, $object_type = 'post' ) { + $content = self::get_object_content( $object_id, $object_type ); + if ( empty( $content ) ) { + return; + } + + $media = self::generate_files_markup( $files ); + $separator = empty( trim( $content ) ) ? '' : "\n\n"; + + self::update_object_content( $object_id, $object_type, $content . $separator . $media ); + } + + /** + * Generate media markup for file-based attachments. + * + * Creates WordPress block markup from file data arrays. Used for cached + * remote media that doesn't have WordPress attachment posts. + * + * @param array[] $files { + * Array of file data arrays. + * + * @type string $url Full URL to the file. + * @type string $mime_type MIME type of the file. + * @type string $alt Alt text for the file. + * } + * + * @return string The generated markup. + */ + public static function generate_files_markup( $files ) { + if ( empty( $files ) ) { + return ''; + } + + /** + * Filters the media markup for ActivityPub file-based attachments. + * + * Allows plugins to provide custom markup for file-based attachments. + * If this filter returns a non-empty string, it will be used instead of + * the default block markup. + * + * @param string $markup The custom markup. Default empty string. + * @param array $files Array of file data arrays. + */ + $custom_markup = \apply_filters( 'activitypub_files_media_markup', '', $files ); + + if ( ! empty( $custom_markup ) ) { + return $custom_markup; + } + + // Default to block markup. + $type = strtok( $files[0]['mime_type'], '/' ); + + // Single video or audio file. + if ( 1 === \count( $files ) && ( 'video' === $type || 'audio' === $type ) ) { + return sprintf( + '
<%1$s controls src="%2$s">
', + \esc_attr( $type ), + \esc_url( $files[0]['url'] ) + ); + } + + // Single image: use standalone image block. + if ( 1 === \count( $files ) && 'image' === $type ) { + return self::get_files_image_block( $files[0] ); + } + + // Multiple attachments: use gallery block. + return self::get_files_gallery_block( $files ); + } + + /** + * Get standalone image block markup for file-based attachments. + * + * @param array $file { + * File data array. + * + * @type string $url Full URL to the file. + * @type string $mime_type MIME type of the file. + * @type string $alt Alt text for the file. + * } + * + * @return string The image block markup. + */ + public static function get_files_image_block( $file ) { + $block = '' . "\n"; + $block .= '
'; + $block .= '' . \esc_attr( $file['alt'] ?? '' ) . ''; + $block .= '
' . "\n"; + $block .= ''; + + return $block; + } + + /** + * Get gallery block markup for file-based attachments. + * + * @param array[] $files { + * Array of file data arrays. + * + * @type string $url Full URL to the file. + * @type string $mime_type MIME type of the file. + * @type string $alt Alt text for the file. + * } + * + * @return string The gallery block markup. + */ + public static function get_files_gallery_block( $files ) { + $gallery = '' . "\n"; + $gallery .= '\n"; + $gallery .= ''; + + return $gallery; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-autoloader.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-autoloader.php new file mode 100644 index 00000000..232a8323 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-autoloader.php @@ -0,0 +1,106 @@ +prefix = $prefix; + $this->prefix_length = \strlen( $prefix ); + $this->path = \rtrim( $path . '/' ); + } + + /** + * Registers Autoloader's autoload function. + * + * @throws \Exception When autoload_function cannot be registered. + * + * @param string $prefix Namespace prefix all classes have in common. + * @param string $path Path to the files to be loaded. + */ + public static function register_path( $prefix, $path ) { + $loader = new self( $prefix, $path ); + \spl_autoload_register( array( $loader, 'load' ) ); + } + + /** + * Loads a class if its namespace starts with `$this->prefix`. + * + * @param string $class_name The class to be loaded. + */ + public function load( $class_name ) { + if ( \strpos( $class_name, $this->prefix . self::NS_SEPARATOR ) !== 0 ) { + return; + } + + // Strip prefix from the start (ala PSR-4). + $class_name = \substr( $class_name, $this->prefix_length + 1 ); + $class_name = \strtolower( $class_name ); + $dir = ''; + + $last_ns_pos = \strripos( $class_name, self::NS_SEPARATOR ); + if ( false !== $last_ns_pos ) { + $namespace = \substr( $class_name, 0, $last_ns_pos ); + $namespace = \str_replace( '_', '-', $namespace ); + $class_name = \substr( $class_name, $last_ns_pos + 1 ); + $dir = \str_replace( self::NS_SEPARATOR, DIRECTORY_SEPARATOR, $namespace ) . DIRECTORY_SEPARATOR; + } + + $path = $this->path . $dir . 'class-' . \str_replace( '_', '-', $class_name ) . '.php'; + + if ( ! \file_exists( $path ) ) { + $path = $this->path . $dir . 'interface-' . \str_replace( '_', '-', $class_name ) . '.php'; + } + + if ( ! \file_exists( $path ) ) { + $path = $this->path . $dir . 'trait-' . \str_replace( '_', '-', $class_name ) . '.php'; + } + + if ( \file_exists( $path ) ) { + require_once $path; + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-avatars.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-avatars.php new file mode 100644 index 00000000..b755bf94 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-avatars.php @@ -0,0 +1,87 @@ +comment_type ) || + $id_or_email->user_id + ) { + return $args; + } + + /** + * Filter allowed comment types for avatars. + * + * @param array $allowed_comment_types Array of allowed comment types. + */ + $allowed_comment_types = \apply_filters( 'get_avatar_comment_types', array( 'comment' ) ); + if ( ! \in_array( $id_or_email->comment_type ?: 'comment', $allowed_comment_types, true ) ) { + return $args; + } + + // Respect WordPress "show avatars" setting. + if ( ! \get_option( 'show_avatars' ) ) { + return $args; + } + + $avatar = null; + + // First, try to get avatar from remote actor. + $remote_actor_id = \get_comment_meta( $id_or_email->comment_ID, '_activitypub_remote_actor_id', true ); + if ( $remote_actor_id ) { + $avatar = Remote_Actors::get_avatar_url( $remote_actor_id ); + } + + // Fall back to avatar_url comment meta for backward compatibility. + if ( ! $avatar ) { + $avatar = \get_comment_meta( $id_or_email->comment_ID, 'avatar_url', true ); + } + + if ( $avatar ) { + if ( empty( $args['class'] ) ) { + $args['class'] = array(); + } elseif ( \is_string( $args['class'] ) ) { + $args['class'] = \explode( ' ', $args['class'] ); + } + + /** This filter is documented in wp-includes/link-template.php */ + $args['url'] = \apply_filters( 'get_avatar_url', $avatar, $id_or_email, $args ); + $args['class'][] = 'avatar'; + $args['class'][] = 'avatar-activitypub'; + $args['class'][] = 'avatar-' . (int) $args['size']; + $args['class'][] = 'photo'; + $args['class'][] = 'u-photo'; + $args['class'] = \array_unique( $args['class'] ); + } + + return $args; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocklist-subscriptions.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocklist-subscriptions.php new file mode 100644 index 00000000..0b93da02 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocklist-subscriptions.php @@ -0,0 +1,222 @@ + timestamp pairs. + */ + public static function get_all() { + return \get_option( self::OPTION_KEY, array() ); + } + + /** + * Add a subscription. + * + * Only adds the URL to the subscription list. Does not sync. + * Call sync() separately to fetch and import domains. + * + * @param string $url The blocklist URL to subscribe to. + * @return bool True on success, false on failure. + */ + public static function add( $url ) { + $url = \sanitize_url( $url ); + + if ( empty( $url ) || ! \filter_var( $url, FILTER_VALIDATE_URL ) ) { + return false; + } + + $subscriptions = self::get_all(); + + // Not already subscribed. + if ( ! isset( $subscriptions[ $url ] ) ) { + // Add subscription with timestamp 0 (never synced). + $subscriptions[ $url ] = 0; + \update_option( self::OPTION_KEY, $subscriptions ); + } + + return true; + } + + /** + * Remove a subscription. + * + * @param string $url The blocklist URL to unsubscribe from. + * @return bool True on success, false if not found. + */ + public static function remove( $url ) { + $subscriptions = self::get_all(); + + if ( ! isset( $subscriptions[ $url ] ) ) { + return false; + } + + unset( $subscriptions[ $url ] ); + \update_option( self::OPTION_KEY, $subscriptions ); + + return true; + } + + /** + * Sync a single subscription. + * + * Fetches the blocklist URL, parses domains, and adds new ones to the blocklist. + * Updates the subscription timestamp on success. + * + * @param string $url The blocklist URL to sync. + * @return int|false Number of domains added, or false on failure. + */ + public static function sync( $url ) { + $response = \wp_safe_remote_get( + $url, + array( + 'timeout' => 30, + 'redirection' => 5, + ) + ); + + if ( \is_wp_error( $response ) ) { + return false; + } + + $response_code = \wp_remote_retrieve_response_code( $response ); + if ( 200 !== $response_code ) { + return false; + } + + $body = \wp_remote_retrieve_body( $response ); + if ( empty( $body ) ) { + return false; + } + + $domains = self::parse_csv_string( $body ); + + if ( empty( $domains ) ) { + return false; + } + + // Get existing blocks and find new ones. + $existing = Moderation::get_site_blocks()[ Moderation::TYPE_DOMAIN ] ?? array(); + $new_domains = \array_diff( $domains, $existing ); + + if ( ! empty( $new_domains ) ) { + Moderation::add_site_blocks( Moderation::TYPE_DOMAIN, $new_domains ); + } + + // Update timestamp if this is a subscription. + $subscriptions = self::get_all(); + if ( isset( $subscriptions[ $url ] ) ) { + $subscriptions[ $url ] = \time(); + \update_option( self::OPTION_KEY, $subscriptions ); + } + + return \count( $new_domains ); + } + + /** + * Sync all subscriptions. + * + * Called by cron job. + */ + public static function sync_all() { + \array_map( array( __CLASS__, 'sync' ), \array_keys( self::get_all() ) ); + } + + /** + * Parse CSV content from a string and extract domain names. + * + * Supports Mastodon CSV format (with #domain header) and simple + * one-domain-per-line format. + * + * @param string $content CSV content as a string. + * @return array Array of unique, valid domain names. + */ + public static function parse_csv_string( $content ) { + $domains = array(); + + if ( empty( $content ) ) { + return $domains; + } + + // Split into lines. + $lines = \preg_split( '/\r\n|\r|\n/', $content ); + if ( empty( $lines ) ) { + return $domains; + } + + // Parse first line to detect format. + $first_line = \str_getcsv( $lines[0], ',', '"', '\\' ); + $first_cell = \trim( $first_line[0] ?? '' ); + $has_header = \str_starts_with( $first_cell, '#' ) || 'domain' === \strtolower( $first_cell ); + + // Find domain column index. + $domain_index = 0; + if ( $has_header ) { + foreach ( $first_line as $i => $col ) { + $col = \ltrim( \strtolower( \trim( $col ) ), '#' ); + if ( 'domain' === $col ) { + $domain_index = $i; + break; + } + } + // Remove header from lines. + \array_shift( $lines ); + } + + // Process each line. + foreach ( $lines as $line ) { + $row = \str_getcsv( $line, ',', '"', '\\' ); + $domain = \trim( $row[ $domain_index ] ?? '' ); + + // Skip empty lines and comments. + if ( empty( $domain ) || \str_starts_with( $domain, '#' ) ) { + continue; + } + + if ( self::is_valid_domain( $domain ) ) { + $domains[] = \strtolower( $domain ); + } + } + + return \array_unique( $domains ); + } + + /** + * Validate a domain name. + * + * @param string $domain The domain to validate. + * @return bool True if valid, false otherwise. + */ + public static function is_valid_domain( $domain ) { + // Must contain at least one dot (filter_var would accept "localhost"). + if ( ! \str_contains( $domain, '.' ) ) { + return false; + } + + return (bool) \filter_var( $domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocks.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocks.php new file mode 100644 index 00000000..b32d768f --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-blocks.php @@ -0,0 +1,1329 @@ + + */ + const SKIP_TAGS = array( 'BR', 'CITE', 'SOURCE' ); + + /** + * HTML void elements that have no closing tag. + * + * @var array + */ + const VOID_TAGS = array( 'AREA', 'BASE', 'BR', 'COL', 'EMBED', 'HR', 'IMG', 'INPUT', 'LINK', 'META', 'SOURCE', 'TRACK', 'WBR' ); + + /** + * Map of HTML tag names to WordPress block types. + * + * @var array + */ + const BLOCK_MAP = array( + 'UL' => 'list', + 'OL' => 'list', + 'IMG' => 'image', + 'BLOCKQUOTE' => 'quote', + 'H1' => 'heading', + 'H2' => 'heading', + 'H3' => 'heading', + 'H4' => 'heading', + 'H5' => 'heading', + 'H6' => 'heading', + 'P' => 'paragraph', + 'A' => 'paragraph', + 'ABBR' => 'paragraph', + 'B' => 'paragraph', + 'CODE' => 'paragraph', + 'EM' => 'paragraph', + 'I' => 'paragraph', + 'STRONG' => 'paragraph', + 'SUB' => 'paragraph', + 'SUP' => 'paragraph', + 'SPAN' => 'paragraph', + 'U' => 'paragraph', + 'FIGURE' => 'image', + 'HR' => 'separator', + ); + + /** + * Initialize the class, registering WordPress hooks. + */ + public static function init() { + // This is already being called on the init hook, so just add it. + self::register_blocks(); + self::register_patterns(); + self::register_templates(); + + \add_action( 'pre_get_posts', array( self::class, 'filter_query_loop_vars' ) ); + + \add_action( 'load-post-new.php', array( self::class, 'handle_in_reply_to_get_param' ) ); + // Add editor plugin. + \add_action( 'enqueue_block_editor_assets', array( self::class, 'enqueue_editor_assets' ) ); + \add_action( 'rest_api_init', array( self::class, 'register_rest_fields' ) ); + + \add_filter( 'activitypub_import_mastodon_post_data', array( self::class, 'filter_import_mastodon_post_data' ), 10, 2 ); + \add_filter( 'activitypub_attachments', array( self::class, 'add_stats_image_attachment' ), 10, 2 ); + + \add_action( 'activitypub_before_get_content', array( self::class, 'add_post_transformation_callbacks' ) ); + \add_filter( 'activitypub_the_content', array( self::class, 'remove_post_transformation_callbacks' ) ); + } + + /** + * Enqueue the block editor assets. + */ + public static function enqueue_editor_assets() { + $data = array( + 'namespace' => ACTIVITYPUB_REST_NAMESPACE, + 'defaultAvatarUrl' => ACTIVITYPUB_PLUGIN_URL . 'assets/img/mp.jpg', + 'enabled' => array( + 'blog' => ! is_user_type_disabled( 'blog' ), + 'users' => ! is_user_type_disabled( 'user' ), + ), + 'profileUrls' => array( + 'user' => \admin_url( 'profile.php#activitypub' ), + 'blog' => \admin_url( 'options-general.php?page=activitypub&tab=blog-profile' ), + ), + 'showAvatars' => (bool) \get_option( 'show_avatars' ), + 'defaultQuotePolicy' => \get_option( 'activitypub_default_quote_policy', ACTIVITYPUB_INTERACTION_POLICY_ANYONE ), + 'objectType' => \get_option( 'activitypub_object_type', ACTIVITYPUB_DEFAULT_OBJECT_TYPE ), + 'noteLength' => ACTIVITYPUB_NOTE_LENGTH, + 'statsImageUrlEndpoint' => Stats_Image::is_available() ? \get_rest_url( null, ACTIVITYPUB_REST_NAMESPACE . '/stats/image-url/{user_id}/{year}' ) : '', + ); + wp_localize_script( 'wp-editor', '_activityPubOptions', $data ); + + // Check for our supported post types. + $current_screen = \get_current_screen(); + $ap_post_types = \get_post_types_by_support( 'activitypub' ); + if ( ! $current_screen || ! in_array( $current_screen->post_type, $ap_post_types, true ) ) { + return; + } + + $asset_data = include ACTIVITYPUB_PLUGIN_DIR . 'build/editor-plugin/plugin.asset.php'; + $plugin_url = plugins_url( 'build/editor-plugin/plugin.js', ACTIVITYPUB_PLUGIN_FILE ); + wp_enqueue_script( 'activitypub-block-editor', $plugin_url, $asset_data['dependencies'], $asset_data['version'], true ); + + $asset_data = include ACTIVITYPUB_PLUGIN_DIR . 'build/pre-publish-panel/plugin.asset.php'; + $plugin_url = plugins_url( 'build/pre-publish-panel/plugin.js', ACTIVITYPUB_PLUGIN_FILE ); + wp_enqueue_script( 'activitypub-pre-publish-panel', $plugin_url, $asset_data['dependencies'], $asset_data['version'], true ); + } + + /** + * Enqueue the reply handle script if the in_reply_to GET param is set. + */ + public static function handle_in_reply_to_get_param() { + // Only load the script if the in_reply_to GET param is set, action happens there, not here. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( ! isset( $_GET['in_reply_to'] ) ) { + return; + } + + $asset_data = include ACTIVITYPUB_PLUGIN_DIR . 'build/reply-intent/plugin.asset.php'; + $plugin_url = plugins_url( 'build/reply-intent/plugin.js', ACTIVITYPUB_PLUGIN_FILE ); + wp_enqueue_script( 'activitypub-reply-intent', $plugin_url, $asset_data['dependencies'], $asset_data['version'], true ); + } + + /** + * Register the blocks. + */ + public static function register_blocks() { + \register_block_type_from_metadata( ACTIVITYPUB_PLUGIN_DIR . '/build/extra-fields' ); + \register_block_type_from_metadata( ACTIVITYPUB_PLUGIN_DIR . '/build/follow-me' ); + \register_block_type_from_metadata( ACTIVITYPUB_PLUGIN_DIR . '/build/followers' ); + \register_block_type_from_metadata( ACTIVITYPUB_PLUGIN_DIR . '/build/posts-and-replies' ); + \register_block_type_from_metadata( ACTIVITYPUB_PLUGIN_DIR . '/build/stats' ); + + // Only register the Following block if the Following feature is enabled. + if ( '1' === \get_option( 'activitypub_following_ui', '0' ) ) { + \register_block_type_from_metadata( ACTIVITYPUB_PLUGIN_DIR . '/build/following' ); + } + // Register reactions block, conditionally removing facepile style if avatars are disabled. + $reactions_args = array(); + if ( ! \get_option( 'show_avatars', true ) ) { + $reactions_args['styles'] = array(); + } + \register_block_type_from_metadata( ACTIVITYPUB_PLUGIN_DIR . '/build/reactions', $reactions_args ); + + \register_block_type_from_metadata( + ACTIVITYPUB_PLUGIN_DIR . '/build/reply', + array( + 'render_callback' => array( self::class, 'render_reply_block' ), + ) + ); + + // Register remote media blocks (server-side only, no editor UI). + \register_block_type( + 'activitypub/emoji', + array( + 'attributes' => array( + 'url' => array( 'type' => 'string' ), + 'updated' => array( 'type' => 'string' ), + ), + 'render_callback' => array( self::class, 'render_emoji_block' ), + ) + ); + + \register_block_type( + 'activitypub/image', + array( + 'attributes' => array( + 'url' => array( 'type' => 'string' ), + ), + 'render_callback' => array( self::class, 'render_image_block' ), + ) + ); + + \register_block_type( + 'activitypub/audio', + array( + 'attributes' => array( + 'url' => array( 'type' => 'string' ), + ), + 'render_callback' => array( self::class, 'render_audio_block' ), + ) + ); + + \register_block_type( + 'activitypub/video', + array( + 'attributes' => array( + 'url' => array( 'type' => 'string' ), + ), + 'render_callback' => array( self::class, 'render_video_block' ), + ) + ); + } + + /** + * Register block patterns for ActivityPub. + */ + public static function register_patterns() { + // Register the ActivityPub pattern category. + \register_block_pattern_category( + 'activitypub', + array( + 'label' => \__( 'Fediverse', 'activitypub' ), + ) + ); + + // Register each pattern. + require ACTIVITYPUB_PLUGIN_DIR . '/patterns/author-header.php'; + require ACTIVITYPUB_PLUGIN_DIR . '/patterns/author-profile.php'; + require ACTIVITYPUB_PLUGIN_DIR . '/patterns/follow-page.php'; + require ACTIVITYPUB_PLUGIN_DIR . '/patterns/profile-page.php'; + require ACTIVITYPUB_PLUGIN_DIR . '/patterns/social-sidebar.php'; + + // Only register the Following page pattern if the Following feature is enabled. + if ( '1' === \get_option( 'activitypub_following_ui', '0' ) ) { + require ACTIVITYPUB_PLUGIN_DIR . '/patterns/following-page.php'; + } + + // Only register the Stats post starter pattern in December and January. + $month = (int) \gmdate( 'n' ); + if ( 12 === $month || 1 === $month ) { + require ACTIVITYPUB_PLUGIN_DIR . '/patterns/stats-post.php'; + } + } + + /** + * Register FSE templates for block themes. + */ + public static function register_templates() { + // Only register templates for block themes on WP 6.7+. + if ( ! \function_exists( 'register_block_template' ) || ! \wp_is_block_theme() ) { + return; + } + + // Use the core `author` hierarchy slug so WP can resolve this for author archives. + \register_block_template( + 'activitypub//author', + array( + 'title' => \__( 'Author Archive (Fediverse)', 'activitypub' ), + 'description' => \__( 'Displays an author archive with Fediverse profile and follow options.', 'activitypub' ), + 'content' => ' + +
+ + + + + + +
+ + + + + + + + + +
+ +
+ +', + 'post_types' => array(), + ) + ); + } + + /** + * Register REST fields needed for blocks. + */ + public static function register_rest_fields() { + // Register the post_count field for Follow Me block. + register_rest_field( + 'user', + 'post_count', + array( + /** + * Get the number of published posts. + * + * @param array $response Prepared response array. + * @param string $field_name The field name. + * @param \WP_REST_Request $request The request object. + * @return int The number of published posts. + */ + 'get_callback' => static function ( $response, $field_name, $request ) { + return (int) count_user_posts( $request->get_param( 'id' ), 'post', true ); + }, + 'schema' => array( + 'description' => 'Number of published posts', + 'type' => 'integer', + 'context' => array( 'activitypub' ), + ), + ) + ); + } + + /** + * Get the user ID from a user string. + * + * @param string $user_string The user string. Can be a user ID, 'blog', or 'inherit'. + * @return int|null The user ID, or null if the 'inherit' string is not supported in this context. + */ + public static function get_user_id( $user_string ) { + if ( is_numeric( $user_string ) ) { + return absint( $user_string ); + } + + // If the user string is 'blog', return the Blog User ID. + if ( 'blog' === $user_string ) { + return Actors::BLOG_USER_ID; + } + + // The only other value should be 'inherit', which means to use the query context to determine the User. + if ( 'inherit' !== $user_string ) { + return null; + } + + // For a homepage/front page, if the Blog User is active, use it. + if ( ( is_front_page() || is_home() ) && ! is_user_type_disabled( 'blog' ) ) { + return Actors::BLOG_USER_ID; + } + + // If we're in a loop, use the post author. + $author_id = get_the_author_meta( 'ID' ); + if ( $author_id ) { + return $author_id; + } + + // For other pages, the queried object will clue us in. + $queried_object = get_queried_object(); + if ( ! $queried_object ) { + return null; + } + + // If we're on a user archive page, use that user's ID. + if ( is_a( $queried_object, 'WP_User' ) ) { + return $queried_object->ID; + } + + // For a single post, use the post author's ID. + if ( is_a( $queried_object, 'WP_Post' ) ) { + return get_the_author_meta( 'ID' ); + } + + // We won't properly account for some conditions, like tag archives. + return null; + } + + /** + * Render an actor list block (followers or following). + * + * @param string $endpoint The endpoint type ('followers' or 'following'). + * @param array $attributes Block attributes. + * @param \WP_Block $block Block instance. + * @param string $content Block content. + * + * @return string|void The HTML to render, or void to render nothing. + */ + public static function render_actor_list_block( $endpoint, $attributes, $block, $content ) { + if ( is_activitypub_request() || \is_feed() ) { + return ''; + } + + $attributes = \wp_parse_args( $attributes ); + $block_name = 'followers' === $endpoint ? __( 'Followers', 'activitypub' ) : __( 'Following', 'activitypub' ); + + if ( empty( $content ) ) { + // Fallback for v1.0.0 blocks. + /* translators: %s: Block type (Followers or Following) */ + $_title = $attributes['title'] ?? \sprintf( __( 'Fediverse %s', 'activitypub' ), $block_name ); + $content = '

' . \esc_html( $_title ) . '

'; + unset( $attributes['title'], $attributes['className'] ); + } else { + $content = \implode( PHP_EOL, \wp_list_pluck( $block->parsed_block['innerBlocks'], 'innerHTML' ) ); + } + + $user_id = self::get_user_id( $attributes['selectedUser'] ); + if ( \is_null( $user_id ) ) { + /* translators: %s: Block type (Followers or Following) */ + return \sprintf( '', $block_name ); + } + + $user = Actors::get_by_id( $user_id ); + if ( \is_wp_error( $user ) ) { + /* translators: 1: Block type (Followers or Following), 2: User ID */ + return \sprintf( '', $block_name, $user_id ); + } + + if ( ! Actors::show_social_graph( $user_id ) ) { + /* translators: %s: Block type (Followers or Following) */ + return \sprintf( '', $block_name ); + } + + $_per_page = \max( 1, \absint( $attributes['per_page'] ) ); + $_show_avatars = (bool) \get_option( 'show_avatars' ); + + // Query the appropriate collection. + if ( 'followers' === $endpoint ) { + $data = \Activitypub\Collection\Followers::query( $user_id, $_per_page ); + $items = $data['followers']; + } else { + $data = \Activitypub\Collection\Following::query( $user_id, $_per_page ); + $items = $data['following']; + } + + // Prepare items data for the Interactivity API context. + $prepared_items = \array_map( + static function ( $item ) { + $actor = \Activitypub\Collection\Remote_Actors::get_actor( $item ); + + // Restrict URLs to http/https schemes to prevent XSS via javascript: URIs. + $url = object_to_uri( $actor->get_url() ) ?: $actor->get_id(); + + return array( + 'handle' => '@' . $actor->get_webfinger(), + 'icon' => $actor->get_icon(), + 'name' => $actor->get_name() ?: $actor->get_preferred_username(), + 'url' => \esc_url( $url, array( 'http', 'https' ) ), + ); + }, + $items + ); + + $store_name = 'activitypub/' . $endpoint; + + // Set up the Interactivity API config. + \wp_interactivity_config( + $store_name, + array( + 'defaultAvatarUrl' => ACTIVITYPUB_PLUGIN_URL . 'assets/img/mp.jpg', + 'namespace' => ACTIVITYPUB_REST_NAMESPACE, + ) + ); + + // Set initial context data. + $context = array( + 'items' => $prepared_items, + 'isLoading' => false, + 'order' => $attributes['order'], + 'page' => 1, + 'pages' => \ceil( $data['total'] / $_per_page ), + 'perPage' => $_per_page, + 'total' => $data['total'], + 'userId' => $user_id, + 'endpoint' => $endpoint, + ); + + // Get block wrapper attributes with the data-wp-interactive attribute. + $wrapper_attributes = \get_block_wrapper_attributes( + array( + 'id' => \wp_unique_id( 'activitypub-' . $endpoint . '-block-' ), + 'data-wp-interactive' => $store_name, + 'data-wp-context' => \wp_json_encode( $context, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ), + ) + ); + + /* translators: %s: Block type (Followers or Following) */ + $nav_label = \sprintf( __( '%s navigation', 'activitypub' ), $block_name ); + + \ob_start(); + ?> +
> + + + $_show_avatars, + 'total' => $data['total'], + 'per_page' => $_per_page, + 'nav_label' => $nav_label, + ) + ); + ?> +
+ $attrs['updated'] ?? null ) + ); + + return Emoji::get_img_tag( $cached_url ?: $url, $name ); + } + + /** + * Render the image block. + * + * Replaces remote image URL with cached URL at runtime. + * + * @param array $attrs The block attributes. + * @param string $content The block inner content (img tag). + * + * @return string The rendered content with cached URL. + */ + public static function render_image_block( $attrs, $content ) { + if ( empty( $attrs['url'] ) || empty( $content ) ) { + return $content; + } + + $url = $attrs['url']; + + // Get entity ID from context. + $entity_id = null; + $post = \get_post(); + if ( $post ) { + $entity_id = $post->ID; + } + + /** + * Filters a remote image URL for caching. + * + * @param string $url The remote image URL. + * @param string $context The context ('media'). + * @param int|null $entity_id The entity ID. + * @param array $options Additional options. + */ + $cached_url = \apply_filters( 'activitypub_remote_media_url', $url, 'media', $entity_id, array() ); + + if ( $cached_url && $cached_url !== $url ) { + return \str_replace( $url, $cached_url, $content ); + } + + return $content; + } + + /** + * Render the audio block. + * + * Replaces remote audio URL with cached URL at runtime. + * + * @param array $attrs The block attributes. + * @param string $content The block inner content (audio tag). + * + * @return string The rendered content with cached URL. + */ + public static function render_audio_block( $attrs, $content ) { + if ( empty( $attrs['url'] ) || empty( $content ) ) { + return $content; + } + + $url = $attrs['url']; + + // Get entity ID from context. + $entity_id = null; + $post = \get_post(); + if ( $post ) { + $entity_id = $post->ID; + } + + /** + * Filters a remote audio URL for caching. + * + * @param string $url The remote audio URL. + * @param string $context The context ('audio'). + * @param int|null $entity_id The entity ID. + * @param array $options Additional options. + */ + $cached_url = \apply_filters( 'activitypub_remote_media_url', $url, 'audio', $entity_id, array() ); + + if ( $cached_url && $cached_url !== $url ) { + return \str_replace( $url, $cached_url, $content ); + } + + return $content; + } + + /** + * Render the video block. + * + * Replaces remote video URL with cached URL at runtime. + * + * @param array $attrs The block attributes. + * @param string $content The block inner content (video tag). + * + * @return string The rendered content with cached URL. + */ + public static function render_video_block( $attrs, $content ) { + if ( empty( $attrs['url'] ) || empty( $content ) ) { + return $content; + } + + $url = $attrs['url']; + + // Get entity ID from context. + $entity_id = null; + $post = \get_post(); + if ( $post ) { + $entity_id = $post->ID; + } + + /** + * Filters a remote video URL for caching. + * + * @param string $url The remote video URL. + * @param string $context The context ('video'). + * @param int|null $entity_id The entity ID. + * @param array $options Additional options. + */ + $cached_url = \apply_filters( 'activitypub_remote_media_url', $url, 'video', $entity_id, array() ); + + if ( $cached_url && $cached_url !== $url ) { + return \str_replace( $url, $cached_url, $content ); + } + + return $content; + } + + /** + * Render the reply block. + * + * @param array $attrs The block attributes. + * + * @return string The HTML to render. + */ + public static function render_reply_block( $attrs ) { + if ( is_activitypub_request() ) { + $attrs['embedPost'] = false; + } + + // Return early if no URL is provided. + if ( empty( $attrs['url'] ) ) { + return null; + } + + $show_embed = isset( $attrs['embedPost'] ) && $attrs['embedPost']; + + $wrapper_attrs = get_block_wrapper_attributes( + array( + 'aria-label' => __( 'Reply', 'activitypub' ), + 'class' => 'activitypub-reply-block', + 'data-in-reply-to' => $attrs['url'], + ) + ); + + $html = '
'; + + // Try to get and append the embed if requested. + $embed = null; + if ( $show_embed ) { + // Use the theme's content width or a reasonable default to avoid narrow embeds. + $embed_width = ! empty( $GLOBALS['content_width'] ) ? $GLOBALS['content_width'] : 600; + $embed = wp_oembed_get( $attrs['url'], array( 'width' => $embed_width ) ); + if ( $embed ) { + $html .= $embed; + \wp_enqueue_script( 'wp-embed' ); + } + } + + // Show the link if embed is not requested or if embed failed. + if ( ! $show_embed || ! $embed ) { + $html .= sprintf( + '

%3$s

', + esc_url( $attrs['url'] ), + esc_attr__( 'This post is a response to the referenced content.', 'activitypub' ), + // translators: %s is the URL of the post being replied to. + sprintf( __( '↬%s', 'activitypub' ), \str_replace( array( 'https://', 'http://' ), '', esc_url( $attrs['url'] ) ) ) + ); + } + + $html .= '
'; + + return $html; + } + + /** + * Renders a modal component that can be used by different blocks. + * + * @param array $args { + * Arguments for the modal. + * + * @type string $content The modal content HTML. + * @type string $id Optional ID prefix for the modal elements. + * @type bool $is_compact Whether the modal is compact (popover-style). Default false. + * @type string $title Static title text for the modal header. + * @type string $title_binding Optional Interactivity API binding for a dynamic title + * (e.g. 'context.modal.title'). When set, uses data-wp-text + * on the title element and enables dynamic compact toggling. + * } + */ + public static function render_modal( $args = array() ) { + $defaults = array( + 'content' => '', + 'id' => '', + 'is_compact' => false, + 'title' => '', + 'title_binding' => '', + ); + + $args = \wp_parse_args( $args, $defaults ); + ?> + +
+ data-wp-class--compact="context.modal.isCompact" + + role="dialog" + aria-modal="true" + hidden + > +
+ +
+

+ id="" + + + data-wp-text="" + + >

+ +
+ +
+ +
+
+
+ ` element that explains decentralized + * interactions to users unfamiliar with the Fediverse. + * + * @since 8.0.0 + */ + public static function render_modal_help() { + ?> +
+ +

+ +

+

+ +

+
+ true, + 'show_pagination' => true, + 'total' => 0, + 'per_page' => 10, + 'nav_label' => __( 'Actor navigation', 'activitypub' ), + ); + + $args = \wp_parse_args( $args, $defaults ); + + // Sanitize numeric values, ensuring per_page is at least 1 to avoid division by zero. + $args['total'] = \absint( $args['total'] ); + $args['per_page'] = \max( 1, \absint( $args['per_page'] ) ); + ?> + +
+
    + +
+ + $args['per_page'] ) : ?> + + +
+
+
+ +
+ .*?

#is', $data['post_content'], $matches ); + $blocks = \array_map( + static function ( $paragraph ) { + return '' . PHP_EOL . $paragraph . PHP_EOL . '' . PHP_EOL; + }, + $matches[0] ?? array() + ); + + $data['post_content'] = \rtrim( \implode( PHP_EOL, $blocks ), PHP_EOL ); + + // Add reply block if it's a reply. + if ( ! empty( $post['object']['inReplyTo'] ) ) { + $reply_block = \sprintf( '' . PHP_EOL, \esc_url( $post['object']['inReplyTo'] ) ); + $data['post_content'] = $reply_block . $data['post_content']; + } + + return $data; + } + + /** + * Add Interactivity directions to the specified element. + * + * @param string $content The block content. + * @param string[] $selector The selector for the element to add directions to. + * @param string[] $attributes The attributes to add to the element. + * + * @return string The updated content. + */ + public static function add_directions( $content, $selector, $attributes ) { + $tags = new \WP_HTML_Tag_Processor( $content ); + + while ( $tags->next_tag( $selector ) ) { + foreach ( $attributes as $key => $value ) { + if ( 'class' === $key ) { + $tags->add_class( $value ); + continue; + } + + $tags->set_attribute( $key, $value ); + } + } + + return $tags->get_updated_html(); + } + + /** + * Add post transformation callbacks. + * + * @param object $post The post object. + */ + public static function add_post_transformation_callbacks( $post ) { + \add_filter( 'render_block_core/embed', array( self::class, 'revert_embed_links' ), 10, 2 ); + \add_filter( 'render_block_activitypub/stats', '__return_empty_string' ); + + // Only transform reply link if it's the first block in the post. + $blocks = \parse_blocks( $post->post_content ); + if ( ! empty( $blocks ) && 'activitypub/reply' === $blocks[0]['blockName'] ) { + \add_filter( 'render_block_activitypub/reply', array( self::class, 'generate_reply_link' ), 10, 2 ); + } + } + + /** + * Remove post transformation callbacks. + * + * @param string $content The post content. + * + * @return string The updated content. + */ + public static function remove_post_transformation_callbacks( $content ) { + \remove_filter( 'render_block_core/embed', array( self::class, 'revert_embed_links' ) ); + \remove_filter( 'render_block_activitypub/reply', array( self::class, 'generate_reply_link' ) ); + \remove_filter( 'render_block_activitypub/stats', '__return_empty_string' ); + + return $content; + } + + /** + * Generate HTML @ link for reply block. + * + * @param string $block_content The block content. + * @param array $block The block data. + * + * @return string The HTML @ link. + */ + public static function generate_reply_link( $block_content, $block ) { + // Unhook ourselves after first execution to ensure only the first reply block gets transformed. + \remove_filter( 'render_block_activitypub/reply', array( self::class, 'generate_reply_link' ) ); + + // Return empty string if no URL is provided. + if ( empty( $block['attrs']['url'] ) ) { + return ''; + } + + $url = $block['attrs']['url']; + + // Try to get ActivityPub representation. Is likely already cached. + $object = Http::get_remote_object( $url ); + if ( \is_wp_error( $object ) ) { + return ''; + } + + $author_url = $object['attributedTo'] ?? ''; + if ( ! $author_url ) { + return ''; + } + + // Fetch author information. + $author = Http::get_remote_object( $author_url ); + if ( \is_wp_error( $author ) ) { + return ''; + } + + // Get webfinger identifier. + $webfinger = ''; + if ( ! empty( $author['webfinger'] ) ) { + $webfinger = \str_replace( 'acct:', '', $author['webfinger'] ); + } elseif ( ! empty( $author['preferredUsername'] ) && ! empty( $author['url'] ) ) { + // Construct webfinger-style identifier from username and domain. + $domain = \wp_parse_url( $author['url'], PHP_URL_HOST ); + $webfinger = '@' . $author['preferredUsername'] . '@' . $domain; + } + + if ( ! $webfinger ) { + return ''; + } + + // Generate HTML @ link. + return \sprintf( + '

%3$s

', + \esc_url( $url ), + \esc_attr( $webfinger ), + \esc_html( '@' . strtok( $webfinger, '@' ) ) + ); + } + + /** + * Add the stats image as an attachment when a post contains the stats block. + * + * Parses the post content for activitypub/stats blocks and appends each + * as an Image attachment to the ActivityPub object. + * + * @since 8.1.0 + * + * @param array $attachments The existing attachments. + * @param \WP_Post $post The post object. + * + * @return array The attachments with stats images appended. + */ + public static function add_stats_image_attachment( $attachments, $post ) { + if ( ! Stats_Image::is_available() ) { + return $attachments; + } + + /* + * The stats image intentionally bypasses the `activitypub_max_image_attachments` + * limit because it replaces the block content rather than being an inline image + * extracted from the post. It is always appended so that the share-pic is + * included in the federated activity regardless of the attachment cap. + */ + $blocks = \parse_blocks( $post->post_content ); + $stats_blocks = self::find_blocks_recursive( $blocks, 'activitypub/stats' ); + + foreach ( $stats_blocks as $block ) { + $user_id = self::get_user_id( $block['attrs']['selectedUser'] ?? 'blog' ); + + if ( null === $user_id ) { + continue; + } + + $year = (int) ( $block['attrs']['year'] ?? (int) \gmdate( 'Y' ) - 1 ); + $url = Stats_Image::get_url( $user_id, $year ); + + if ( \is_wp_error( $url ) ) { + continue; + } + + // Determine mime type from URL extension. + $mime_type = \str_ends_with( $url, '.webp' ) ? 'image/webp' : 'image/png'; + + $attachments[] = array( + 'type' => 'Image', + 'mediaType' => $mime_type, + 'url' => $url, + 'name' => \sprintf( + /* translators: %d: The year */ + \__( 'Fediverse Stats %d', 'activitypub' ), + $year + ), + ); + } + + return $attachments; + } + + /** + * Recursively find blocks of a given type in a block tree. + * + * @since 8.1.0 + * + * @param array $blocks The parsed blocks. + * @param string $block_name The block name to search for. + * + * @return array The matching blocks. + */ + private static function find_blocks_recursive( $blocks, $block_name ) { + $found = array(); + + foreach ( $blocks as $block ) { + if ( $block_name === $block['blockName'] ) { + $found[] = $block; + } + + if ( ! empty( $block['innerBlocks'] ) ) { + $found = \array_merge( $found, self::find_blocks_recursive( $block['innerBlocks'], $block_name ) ); + } + } + + return $found; + } + + /** + * Transform Embed blocks to block level link. + * + * Remote servers will simply drop iframe elements, rendering incomplete content. + * + * @see https://www.w3.org/TR/activitypub/#security-sanitizing-content + * @see https://www.w3.org/wiki/ActivityPub/Primer/HTML + * + * @param string $block_content The block content (html). + * @param object $block The block object. + * + * @return string A block level link + */ + public static function revert_embed_links( $block_content, $block ) { + if ( ! isset( $block['attrs']['url'] ) ) { + return $block_content; + } + return '

' . $block['attrs']['url'] . '

'; + } + + /** + * Convert HTML content to blocks. + * + * Tokenizes the content with wp_html_split(), tracks nesting depth, + * and wraps each top-level element in block comment delimiters. + * + * @since 8.1.0 + * + * @param string $content The HTML content. + * + * @return string The content converted to blocks. + */ + public static function convert_from_html( $content ) { + if ( empty( $content ) ) { + return ''; + } + + $tokens = \wp_html_split( $content ); + $_content = ''; + $depth = 0; + $current_tag = ''; + $current_html = ''; + + foreach ( $tokens as $token ) { + if ( '' === $token ) { + continue; + } + + // Text content — accumulate only inside a top-level element. + if ( '<' !== $token[0] ) { + if ( $depth > 0 ) { + $current_html .= $token; + } + continue; + } + + // Closing tag. + if ( '/' === $token[1] ) { + $current_html .= $token; + --$depth; + + if ( 0 === $depth && '' !== $current_tag ) { + $_content .= self::to_block( $current_tag, $current_html ); + $current_tag = ''; + $current_html = ''; + } + continue; + } + + // Extract the tag name from the opening tag. + if ( ! \preg_match( '/^<([a-zA-Z][a-zA-Z0-9]*)/', $token, $m ) ) { + if ( $depth > 0 ) { + $current_html .= $token; + } + continue; + } + + $tag = \strtoupper( $m[1] ); + + // Start of a new top-level element. + if ( 0 === $depth ) { + $current_tag = $tag; + $current_html = $token; + } else { + $current_html .= $token; + } + + // Void elements don't increase depth — flush immediately at top level. + if ( \in_array( $tag, self::VOID_TAGS, true ) ) { + if ( 0 === $depth && '' !== $current_tag ) { + $_content .= self::to_block( $current_tag, $current_html ); + $current_tag = ''; + $current_html = ''; + } + } else { + ++$depth; + } + } + + return $_content; + } + + /** + * Wrap an HTML element in block comment delimiters. + * + * @since 8.1.0 + * + * @param string $tag The uppercase tag name. + * @param string $html The element HTML. + * + * @return string The block-wrapped HTML, or empty string for skipped tags. + */ + private static function to_block( $tag, $html ) { + if ( \in_array( $tag, self::SKIP_TAGS, true ) ) { + return ''; + } + + $block_type = self::BLOCK_MAP[ $tag ] ?? 'html'; + $block_attrs = array(); + + if ( 'OL' === $tag ) { + $block_attrs['ordered'] = true; + } + + return \get_comment_delimited_block_content( $block_type, $block_attrs, \trim( $html ) ); + } + + /** + * Filter the main query to exclude replies. + * + * Adds a WHERE clause to exclude posts containing the `activitypub/reply` + * block when the visitor has explicitly requested the "Posts" tab via + * `?filter=posts`. This filters the main query so that Query Loop blocks + * with `inherit: true` also pick up the filter. + * + * The filter only attaches on that explicit opt-in. Admin, feed, and any + * regular frontend request (front page, archives, search…) are never + * touched, which is why no block-presence probing is needed: the only + * way `?filter=posts` appears in a URL is from a click on the + * `activitypub/posts-and-replies` tab block. + * + * @since 8.1.0 + * + * @param WP_Query $query The WP_Query instance. + */ + public static function filter_query_loop_vars( $query ) { + // Never touch admin or feed queries. + if ( \is_admin() || $query->is_feed() ) { + return; + } + + if ( ! $query->is_main_query() || $query->is_singular() ) { + return; + } + + // Skip the reply-exclusion filter for queries that only target + // non-ActivityPub post types to avoid a full table scan. + $query_post_type = $query->get( 'post_type' ); + if ( ! empty( $query_post_type ) && 'any' !== $query_post_type ) { + $query_post_types = (array) $query_post_type; + if ( ! array_intersect( $query_post_types, \get_post_types_by_support( 'activitypub' ) ) ) { + return; + } + } + + // Only filter when the "Posts" tab has been explicitly selected. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( ! isset( $_GET['filter'] ) || 'posts' !== \sanitize_key( \wp_unslash( $_GET['filter'] ) ) ) { + return; + } + + \add_filter( 'posts_where', array( self::class, 'exclude_replies_where' ) ); + } + + /** + * Exclude posts containing the activitypub/reply block. + * + * Removes itself after the first execution to avoid + * affecting secondary queries on the same page. + * + * @since 8.1.0 + * + * @param string $where The WHERE clause. + * @return string Modified WHERE clause. + */ + public static function exclude_replies_where( $where ) { + \remove_filter( 'posts_where', array( self::class, 'exclude_replies_where' ) ); + + global $wpdb; + + $where .= $wpdb->prepare( + " AND {$wpdb->posts}.post_content NOT LIKE %s", + '%', \wp_json_encode( $attributes ) ) ); + + /** + * Filters the HTML markup for the ActivityPub remote comment reply container. + * + * @param string $block The HTML markup for the remote reply container. + */ + return \apply_filters( 'activitypub_comment_reply_link', $block ); + } + + /** + * Check if it is allowed to comment to a comment. + * + * Checks if the comment is local only or if the user can comment federated comments. + * + * @param mixed $comment Comment object or ID. + * + * @return boolean True if the user can comment, false otherwise. + */ + public static function are_comments_allowed( $comment ) { + $comment = \get_comment( $comment ); + + if ( ! self::was_received( $comment ) ) { + return true; + } + + $current_user = get_current_user_id(); + + if ( ! $current_user ) { + return false; + } + + if ( is_single_user() && \user_can( $current_user, 'activitypub' ) ) { + // On a single user site, comments by users with the `activitypub` capability will be federated as the blog user. + $current_user = Actors::BLOG_USER_ID; + } + + // User is not allowed to federate comments. + return user_can_activitypub( $current_user ); + } + + /** + * Check if a comment is federated. + * + * We consider a comment federated if comment was received via ActivityPub. + * + * Use this function to check if it is comment that was received via ActivityPub. + * + * @param mixed $comment Comment object or ID. + * + * @return boolean True if the comment is federated, false otherwise. + */ + public static function was_received( $comment ) { + $comment = \get_comment( $comment ); + + if ( ! $comment ) { + return false; + } + + $protocol = \get_comment_meta( $comment->comment_ID, 'protocol', true ); + + if ( 'activitypub' === $protocol ) { + return true; + } + + return false; + } + + /** + * Check if a comment was federated. + * + * This function checks if a comment was federated via ActivityPub. + * + * @param mixed $comment Comment object or ID. + * + * @return boolean True if the comment was federated, false otherwise. + */ + public static function was_sent( $comment ) { + $comment = \get_comment( $comment ); + + if ( ! $comment ) { + return false; + } + + $status = \get_comment_meta( $comment->comment_ID, 'activitypub_status', true ); + + if ( $status ) { + return true; + } + + return false; + } + + /** + * Check if a comment is local only. + * + * This function checks if a comment is local only and was not sent or received via ActivityPub. + * + * @param mixed $comment Comment object or ID. + * + * @return boolean True if the comment is local only, false otherwise. + */ + public static function is_local( $comment ) { + if ( self::was_sent( $comment ) || self::was_received( $comment ) ) { + return false; + } + + return true; + } + + /** + * Check if a comment should be federated. + * + * We consider a comment should be federated if it is authored by a user that is + * not disabled for federation and if it is a reply directly to the post or to a + * federated comment. + * + * Use this function to check if a comment should be federated. + * + * @param mixed $comment Comment object or ID. + * + * @return boolean True if the comment should be federated, false otherwise. + */ + public static function should_be_federated( $comment ) { + // We should not federate federated comments. + if ( self::was_received( $comment ) ) { + return false; + } + + $comment = \get_comment( $comment ); + $user_id = $comment->user_id; + + // Comments without user can't be federated. + if ( ! $user_id ) { + return false; + } + + if ( is_single_user() && \user_can( $user_id, 'activitypub' ) ) { + // On a single user site, comments by users with the `activitypub` capability will be federated as the blog user. + $user_id = Actors::BLOG_USER_ID; + } + + // User is not allowed to federate comments. + if ( ! user_can_activitypub( $user_id ) ) { + return false; + } + + // It is a comment to the post and can be federated. + if ( empty( $comment->comment_parent ) ) { + return true; + } + + // Check if parent comment is federated. + $parent_comment = \get_comment( $comment->comment_parent ); + + return ! self::is_local( $parent_comment ); + } + + /** + * Examine a comment ID and look up an existing comment it represents. + * + * @param string $id ActivityPub object ID (usually a URL) to check. + * + * @return \WP_Comment|false Comment object, or false on failure. + */ + public static function object_id_to_comment( $id ) { + $comment_query = new \WP_Comment_Query( + array( + 'meta_key' => 'source_id', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + 'meta_value' => $id, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value + 'orderby' => 'comment_date', + 'order' => 'DESC', + ) + ); + + if ( ! $comment_query->comments ) { + return false; + } + + return $comment_query->comments[0]; + } + + /** + * Verify if URL is a local comment, or if it is a previously received + * remote comment (For threading comments locally). + * + * @param string $url The URL to check. + * + * @return string|null Comment ID or null if not found. + */ + public static function url_to_commentid( $url ) { + if ( ! $url || ! \filter_var( $url, \FILTER_VALIDATE_URL ) ) { + return null; + } + + // Check for local comment. + if ( is_same_domain( $url ) ) { + $query = \wp_parse_url( $url, \PHP_URL_QUERY ); + + if ( $query ) { + \parse_str( $query, $params ); + + if ( ! empty( $params['c'] ) ) { + $comment = \get_comment( $params['c'] ); + + if ( $comment ) { + return $comment->comment_ID; + } + } + } + } + + $args = array( + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => 'source_url', + 'value' => $url, + ), + array( + 'key' => 'source_id', + 'value' => $url, + ), + ), + ); + + $query = new \WP_Comment_Query(); + $comments = $query->query( $args ); + + if ( $comments && is_array( $comments ) ) { + return $comments[0]->comment_ID; + } + + return null; + } + + /** + * Filters the CSS classes to add an ActivityPub class. + * + * @param string[] $classes An array of comment classes. + * @param string[] $css_class An array of additional classes added to the list. + * @param string $comment_id The comment ID as a numeric string. + * + * @return string[] An array of classes. + */ + public static function comment_class( $classes, $css_class, $comment_id ) { + // Check if ActivityPub comment. + if ( 'activitypub' === get_comment_meta( $comment_id, 'protocol', true ) ) { + $classes[] = 'activitypub-comment'; + } + + return $classes; + } + + /** + * Makes the comment feed filterable by comment type. + * + * Also excludes ActivityPub comment types from the feed when no type is specified. + * + * @param string $where The `WHERE` clause for the comment feed query. + * + * @return string The modified `WHERE` clause. + */ + public static function comment_feed_where( $where ) { + global $wpdb; + + $comment_type = \get_query_var( 'type' ); + + if ( 'all' === $comment_type ) { + return $where; + } + + $comment_types = self::get_comment_type_slugs(); + + if ( \in_array( $comment_type, $comment_types, true ) ) { + $where .= $wpdb->prepare( ' AND comment_type = %s', $comment_type ); + } else { + $comment_types = \array_map( 'esc_sql', $comment_types ); + $placeholders = implode( ', ', array_fill( 0, count( $comment_types ), '%s' ) ); + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber, WordPress.DB.PreparedSQL.NotPrepared + $where .= $wpdb->prepare( sprintf( ' AND comment_type NOT IN (%s)', $placeholders ), ...$comment_types ); + } + + return $where; + } + + /** + * Gets the public comment id via the WordPress comments meta. + * + * @param int $wp_comment_id The internal WordPress comment ID. + * @param bool $fallback Whether the code should fall back to `source_url` if `source_id` is not set. + * + * @return string|null The ActivityPub id/url of the comment. + */ + public static function get_source_id( $wp_comment_id, $fallback = true ) { + $comment_meta = \get_comment_meta( $wp_comment_id ); + + if ( ! empty( $comment_meta['source_id'][0] ) ) { + return $comment_meta['source_id'][0]; + } elseif ( ! empty( $comment_meta['source_url'][0] ) && $fallback ) { + return $comment_meta['source_url'][0]; + } + + return null; + } + + /** + * Gets the public comment url via the WordPress comments meta. + * + * @param int $wp_comment_id The internal WordPress comment ID. + * @param bool $fallback Whether the code should fall back to `source_id` if `source_url` is not set. + * + * @return string|null The ActivityPub id/url of the comment. + */ + public static function get_source_url( $wp_comment_id, $fallback = true ) { + $comment_meta = \get_comment_meta( $wp_comment_id ); + + if ( ! empty( $comment_meta['source_url'][0] ) ) { + return $comment_meta['source_url'][0]; + } elseif ( ! empty( $comment_meta['source_id'][0] ) && $fallback ) { + return $comment_meta['source_id'][0]; + } + + return null; + } + + /** + * Link remote comments to source url. + * + * @param string $comment_link The comment link. + * @param object|\WP_Comment $comment The comment object. + * + * @return string $url + */ + public static function remote_comment_link( $comment_link, $comment ) { + if ( ! $comment || \is_admin() || \is_search() ) { + return $comment_link; + } + + $remote_comment_link = null; + if ( 'comment' === $comment->comment_type ) { + $remote_comment_link = self::get_source_url( $comment->comment_ID ); + } + + return $remote_comment_link ?? $comment_link; + } + + + /** + * Generates an ActivityPub URI for a comment + * + * @param \WP_Comment|int $comment A comment object or comment ID. + * + * @return string ActivityPub URI for comment + */ + public static function generate_id( $comment ) { + $comment = \get_comment( $comment ); + + // Show external comment ID if it exists. + $public_comment_link = self::get_source_id( $comment->comment_ID ); + + if ( $public_comment_link ) { + return $public_comment_link; + } + + // Generate URI based on comment ID. + return \add_query_arg( 'c', $comment->comment_ID, \home_url( '/' ) ); + } + + /** + * Check if a post has remote comments + * + * @param int $post_id The post ID. + * + * @return bool True if the post has remote comments, false otherwise. + */ + private static function post_has_remote_comments( $post_id ) { + $comments = \get_comments( + array( + 'post_id' => $post_id, + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => 'protocol', + 'value' => 'activitypub', + 'compare' => '=', + ), + array( + 'key' => 'source_id', + 'compare' => 'EXISTS', + ), + ), + ) + ); + + return ! empty( $comments ); + } + + /** + * Get the comment type by activity type. + * + * @param string $activity_type The activity type. + * + * @return array|null The comment type. + */ + public static function get_comment_type_by_activity_type( $activity_type ) { + $activity_type = \strtolower( $activity_type ); + $activity_type = \sanitize_key( $activity_type ); + $comment_types = self::get_comment_types(); + + foreach ( $comment_types as $comment_type ) { + if ( in_array( $activity_type, $comment_type['activity_types'], true ) ) { + return $comment_type; + } + } + + return null; + } + + /** + * Return the registered custom comment types. + * + * @return array The registered custom comment types + */ + public static function get_comment_types() { + global $activitypub_comment_types; + + return (array) $activitypub_comment_types; + } + + /** + * Is this a registered comment type. + * + * @param string $slug The slug of the type. + * + * @return boolean True if registered. + */ + public static function is_registered_comment_type( $slug ) { + $slug = \strtolower( $slug ); + $slug = \sanitize_key( $slug ); + + $comment_types = self::get_comment_types(); + + return isset( $comment_types[ $slug ] ); + } + + /** + * Return the registered custom comment type slugs. + * + * @return array The registered custom comment type slugs. + */ + public static function get_comment_type_slugs() { + if ( ! did_action( 'init' ) ) { + _doing_it_wrong( __METHOD__, 'This function should not be called before the init action has run. Comment types are only available after init.', '7.5.0' ); + + return array(); + } + + return array_keys( self::get_comment_types() ); + } + + /** + * Get the custom comment type. + * + * Check if the type is registered, if not, check if it is a custom type. + * + * It looks for the array key in the registered types and returns the array. + * If it is not found, it looks for the type in the custom types and returns the array. + * + * @param string $type The comment type. + * + * @return array The comment type. + */ + public static function get_comment_type( $type ) { + $type = strtolower( $type ); + $type = sanitize_key( $type ); + + $comment_types = self::get_comment_types(); + $type_array = array(); + + // Check array keys. + if ( in_array( $type, array_keys( $comment_types ), true ) ) { + $type_array = $comment_types[ $type ]; + } + + /** + * Filter the comment type. + * + * @param array $type_array The comment type. + */ + return apply_filters( "activitypub_comment_type_{$type}", $type_array ); + } + + /** + * Get a comment type attribute. + * + * @param string $type The comment type. + * @param string $attr The attribute to get. + * + * @return mixed The value of the attribute. + */ + public static function get_comment_type_attr( $type, $attr ) { + $type_array = self::get_comment_type( $type ); + + if ( $type_array && isset( $type_array[ $attr ] ) ) { + $value = $type_array[ $attr ]; + } else { + $value = ''; + } + + /** + * Filter the comment type attribute. + * + * @param mixed $value The value of the attribute. + * @param string $type The comment type. + */ + return apply_filters( "activitypub_comment_type_{$attr}", $value, $type ); + } + + /** + * Register the comment types used by the ActivityPub plugin. + */ + public static function register_comment_types() { + register_comment_type( + 'repost', + array( + 'label' => __( 'Reposts', 'activitypub' ), + 'singular' => __( 'Repost', 'activitypub' ), + 'description' => 'A repost (or Announce) is when a post appears in the timeline because someone else shared it, while still showing the original author as the source.', + 'icon' => '♻️', + 'class' => 'p-repost', + 'type' => 'repost', + 'collection' => 'reposts', + 'activity_types' => array( 'announce' ), + 'excerpt' => html_entity_decode( \__( '… reposted this!', 'activitypub' ) ), + /* translators: %d: Number of reposts */ + 'count_single' => _x( '%d repost', 'number of reposts', 'activitypub' ), + /* translators: %d: Number of reposts */ + 'count_plural' => _x( '%d reposts', 'number of reposts', 'activitypub' ), + ) + ); + + register_comment_type( + 'like', + array( + 'label' => __( 'Likes', 'activitypub' ), + 'singular' => __( 'Like', 'activitypub' ), + 'description' => 'A like is a small positive reaction that shows appreciation for a post without sharing it further.', + 'icon' => '👍', + 'class' => 'p-like', + 'type' => 'like', + 'collection' => 'likes', + 'activity_types' => array( 'like' ), + 'excerpt' => html_entity_decode( \__( '… liked this!', 'activitypub' ) ), + /* translators: %d: Number of likes */ + 'count_single' => _x( '%d like', 'number of likes', 'activitypub' ), + /* translators: %d: Number of likes */ + 'count_plural' => _x( '%d likes', 'number of likes', 'activitypub' ), + ) + ); + + register_comment_type( + 'quote', + array( + 'label' => __( 'Quotes', 'activitypub' ), + 'singular' => __( 'Quote', 'activitypub' ), + 'description' => 'A quote is when a post is shared along with an added comment, so the original post appears together with the sharer’s own words.', + 'icon' => '❞', + 'class' => 'p-quote', + 'type' => 'quote', + 'collection' => 'quotes', + 'activity_types' => array( 'quote' ), + 'excerpt' => html_entity_decode( \__( '… quoted this!', 'activitypub' ) ), + /* translators: %d: Number of quotes */ + 'count_single' => _x( '%d quote', 'number of quotes', 'activitypub' ), + /* translators: %d: Number of quotes */ + 'count_plural' => _x( '%d quotes', 'number of quotes', 'activitypub' ), + ) + ); + } + + /** + * Show avatars on Activities if set. + * + * @param array $types List of avatar enabled comment types. + * + * @return array show avatars on Activities + */ + public static function get_avatar_comment_types( $types ) { + $comment_types = self::get_comment_type_slugs(); + $types = array_merge( $types, $comment_types ); + + return array_unique( $types ); + } + + /** + * Excludes likes and reposts from comment queries. + * + * @author Jan Boddez + * + * @see https://github.com/janboddez/indieblocks/blob/a2d59de358031056a649ee47a1332ce9e39d4ce2/includes/functions.php#L423-L432 + * + * @param \WP_Comment_Query $query Comment count. + */ + public static function comment_query( $query ) { + if ( ! $query instanceof \WP_Comment_Query ) { + return; + } + + // Do not exclude likes and reposts on ActivityPub requests. + if ( defined( 'ACTIVITYPUB_REQUEST' ) && ACTIVITYPUB_REQUEST ) { + return; + } + + // Do not exclude likes and reposts on REST requests (handled by rest_comment_query). + if ( \wp_is_serving_rest_request() ) { + return; + } + + // Filter post types for admin requests. + if ( \is_admin() ) { + $query->query_vars['post_type'] = self::get_allowed_comment_post_types(); + return; + } + + // Do not exclude likes and reposts on non-singular pages. + if ( ! \is_singular() ) { + return; + } + + // Do not exclude likes and reposts if the query is for specific types. + if ( ! empty( $query->query_vars['type__in'] ) || ! empty( $query->query_vars['type'] ) ) { + return; + } + + // Do not exclude likes and reposts if the query is already excluding other comment types. + if ( ! empty( $query->query_vars['type__not_in'] ) ) { + return; + } + + // Exclude likes and reposts by the ActivityPub plugin. + $query->query_vars['type__not_in'] = self::get_comment_type_slugs(); + } + + /** + * Filters comments in REST API requests. + * + * Excludes comments on ActivityPub post types and ActivityPub comment + * types (likes, reposts) from the REST API. + * + * @param array $prepared_args Array of arguments for WP_Comment_Query. + * + * @return array Modified array of arguments. + */ + public static function rest_comment_query( $prepared_args ) { + // Exclude comments on ActivityPub post types. + $prepared_args['post_type'] = self::get_allowed_comment_post_types(); + + // Exclude ActivityPub comment types (likes, reposts) unless explicitly requested. + if ( empty( $prepared_args['type'] ) && empty( $prepared_args['type__in'] ) ) { + $prepared_args['type__not_in'] = self::get_comment_type_slugs(); + } + + return $prepared_args; + } + + /** + * Returns post types that should show comments (excluding hidden post types). + * + * @return array Array of post type names. + */ + private static function get_allowed_comment_post_types() { + $hide_for = self::hide_for(); + + if ( empty( $hide_for ) ) { + return \get_post_types_by_support( 'comments' ); + } + + return \array_diff( \get_post_types_by_support( 'comments' ), $hide_for ); + } + + /** + * Filter the comment status before it is set. + * + * @param int|string|\WP_Error $approved The approved comment status. + * @param array $comment_data The comment data. + * + * @return int|string|\WP_Error The approval status. 1, 0, 'spam', 'trash', or WP_Error. + */ + public static function pre_comment_approved( $approved, $comment_data ) { + /* + * Only return early for already-approved comments, trash, or errors. + * Don't short-circuit on 'spam' - we may want to override Akismet. + * Respect 'trash' since it comes from the WordPress disallowed list. + */ + if ( 1 === $approved || '1' === $approved || 'trash' === $approved || \is_wp_error( $approved ) ) { + return $approved; + } + + // Maybe auto-approve likes and reposts. + if ( + \in_array( $comment_data['comment_type'], self::get_comment_type_slugs(), true ) && + '1' === \get_option( 'activitypub_auto_approve_reactions' ) + ) { + return 1; + } + + /* + * Always auto-approve comments on remote posts (ap_post) since + * they are not visible in the WP admin comment moderation screen. + */ + $post_id = $comment_data['comment_post_ID']; + $post = \get_post( $post_id ); + + if ( $post && \in_array( $post->post_type, self::hide_for(), true ) ) { + return 1; + } + + if ( '1' !== \get_option( 'comment_previously_approved' ) ) { + return $approved; + } + + if ( + empty( $comment_data['comment_meta']['protocol'] ) || + 'activitypub' !== $comment_data['comment_meta']['protocol'] + ) { + return $approved; + } + + global $wpdb; + + $author = $comment_data['comment_author']; + $author_url = $comment_data['comment_author_url']; + // phpcs:ignore + $ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE comment_author = %s AND comment_author_url = %s and comment_approved = '1' LIMIT 1", $author, $author_url ) ); + + if ( 1 === (int) $ok_to_comment ) { + return 1; + } + + return $approved; + } + + /** + * Update comment counts when interaction settings are disabled. + * + * Triggers a recount when likes or reposts are disabled to ensure accurate comment counts. + * + * @param mixed $old_value The old option value. + * @param mixed $value The new option value. + */ + public static function maybe_update_comment_counts( $old_value, $value ) { + if ( '1' === $old_value && '1' !== $value ) { + Migration::update_comment_counts(); + } + } + + /** + * Filters the comment count to exclude ActivityPub comment types. + * + * @param int|null $new_count The new comment count. Default null. + * @param int $old_count The old comment count. + * @param int $post_id Post ID. + * + * @return int|null The updated comment count, or null to use the default query. + */ + public static function pre_wp_update_comment_count_now( $new_count, $old_count, $post_id ) { + if ( null === $new_count ) { + $excluded_types = array_filter( self::get_comment_type_slugs(), array( self::class, 'is_comment_type_enabled' ) ); + + if ( ! empty( $excluded_types ) ) { + /* + * Include 'note' type when Gutenberg's filter is registered, so a + * single query excludes both ActivityPub and Gutenberg types. + */ + if ( \has_filter( 'pre_wp_update_comment_count_now', 'gutenberg_exclude_notes_from_comment_count' ) ) { + $excluded_types[] = 'note'; + } + + /** + * Filters the comment types excluded from the comment count. + * + * Runs at priority 5 on `pre_wp_update_comment_count_now` so that + * a single query can exclude types from multiple plugins. Other + * plugins can hook here to add their own comment types. + * + * @since 8.0.0 + * + * @param string[] $excluded_types The comment type slugs to exclude. + * @param int $post_id The post ID. + */ + $excluded_types = \apply_filters( 'activitypub_excluded_comment_types', $excluded_types, $post_id ); + $excluded_types = array_unique( array_filter( $excluded_types ) ); + + global $wpdb; + + // phpcs:ignore WordPress.DB + $new_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_type NOT IN ('" . implode( "','", $excluded_types ) . "')", $post_id ) ); + } + } + + return $new_count; + } + + /** + * Check if a comment type is enabled. + * + * @param string $comment_type The comment type. + * @return bool True if the comment type is enabled. + */ + public static function is_comment_type_enabled( $comment_type ) { + return '1' === get_option( "activitypub_allow_{$comment_type}s", '1' ); + } + + /** + * Get post types to hide comments for in admin. + * + * These are non-public post types whose comments should not appear + * in the main comments list in the WordPress admin. + * + * @return string[] Array of post type names to hide comments for. + */ + public static function hide_for() { + $post_types = array( Remote_Posts::POST_TYPE ); + + /** + * Filters the list of post types to hide comments for. + * + * @param string[] $post_types Array of post type names to hide comments for. + */ + return \apply_filters( 'activitypub_hide_comments_for', $post_types ); + } + + /** + * Render emoji in comment author name. + * + * Replaces emoji shortcodes with img tags on the get_comment_author filter. + * Emoji data is retrieved from the linked remote actor. + * + * @param string $author The comment author name. + * @param string $comment_id The comment ID as a numeric string. + * + * @return string The comment author name with rendered emoji. + */ + public static function render_emoji( $author, $comment_id ) { + $remote_actor_id = \get_comment_meta( $comment_id, '_activitypub_remote_actor_id', true ); + + if ( empty( $remote_actor_id ) ) { + return $author; + } + + $emoji_data = \get_post_meta( $remote_actor_id, '_activitypub_emoji', true ); + + if ( empty( $emoji_data ) ) { + return $author; + } + + return Emoji::replace_from_json( $author, $emoji_data ); + } + + /** + * Selectively unescape emoji images in comment author. + * + * This runs at priority 20 after WordPress's esc_html() filter on comment_author. + * + * @param string $author The comment author name (already escaped by WordPress). + * + * @return string The comment author name with emoji images unescaped. + */ + public static function unescape_emoji( $author ) { + // Only attempt to unescape if there are emoji images present in the escaped string. + if ( false === \strpos( $author, 'class="emoji"' ) ) { + return $author; + } + + // Decode entities so we can selectively restore emoji tags. + $decoded = \html_entity_decode( $author, ENT_QUOTES | ENT_HTML5, 'UTF-8' ); + + // Use strict KSES validation to only allow valid emoji img tags. + return \wp_kses( $decoded, Emoji::get_kses_allowed_html() ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-dispatcher.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-dispatcher.php new file mode 100644 index 00000000..22b1bf40 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-dispatcher.php @@ -0,0 +1,578 @@ +ID, '_activitypub_activity_type', true ); + $actor = Outbox::get_actor( $outbox_item ); + if ( \is_wp_error( $actor ) && 'Delete' !== $type ) { + // If the actor is not found, publish the post and don't try again. + \wp_publish_post( $outbox_item ); + return; + } + + $activity = Outbox::get_activity( $outbox_item ); + + // Send to mentioned and replied-to users. Everyone other than followers. + self::send_to_additional_inboxes( $activity, $outbox_item->post_author, $outbox_item ); + + if ( self::should_send_to_followers( $activity, $actor, $outbox_item ) ) { + \do_action( + 'activitypub_send_activity', + $outbox_item->ID, + self::get_batch_size(), + \get_post_meta( $outbox_item->ID, '_activitypub_outbox_offset', true ) ?: 0 // phpcs:ignore + ); + } else { + // No followers to process for this update. We're done. + \wp_publish_post( $outbox_item ); + \delete_post_meta( $outbox_item->ID, '_activitypub_outbox_offset' ); + } + } + + /** + * Asynchronously runs batch processing routines. + * + * @param int $outbox_item_id The Outbox item ID. + * @param int|null $batch_size Optional. The batch size. Default null (uses filtered batch size). + * @param int $offset Optional. The offset. Default 0. + * + * @return array|void The next batch of followers to process, or void if done. + */ + public static function send_to_followers( $outbox_item_id, $batch_size = ACTIVITYPUB_OUTBOX_PROCESSING_BATCH_SIZE, $offset = 0 ) { + if ( null === $batch_size ) { + $batch_size = self::get_batch_size(); + } + + $outbox_item = \get_post( $outbox_item_id ); + + if ( ! $outbox_item ) { + return; + } + + $activity = Outbox::get_activity( $outbox_item_id ); + + if ( \is_wp_error( $activity ) ) { + return; + } + + $json = $activity->to_json(); + $inboxes = Followers::get_inboxes_for_activity( $json, $outbox_item->post_author, $batch_size, $offset ); + $retries = self::send_to_inboxes( $inboxes, $outbox_item_id ); + + // Retry failed inboxes. + if ( ! empty( $retries ) ) { + self::schedule_retry( $retries, $outbox_item_id ); + } + + if ( is_countable( $inboxes ) && count( $inboxes ) < $batch_size ) { + \delete_post_meta( $outbox_item_id, '_activitypub_outbox_offset' ); + + /** + * Fires when the followers are complete. + * + * @param array $inboxes The inboxes. + * @param string $json The ActivityPub Activity JSON + * @param int $actor_id The actor ID. + * @param int $outbox_item_id The Outbox item ID. + * @param int $batch_size The batch size. + * @param int $offset The offset. + */ + \do_action( 'activitypub_outbox_processing_complete', $inboxes, $json, $outbox_item->post_author, $outbox_item_id, $batch_size, $offset ); + + // No more followers to process for this update. + \wp_publish_post( $outbox_item_id ); + } else { + \update_post_meta( $outbox_item_id, '_activitypub_outbox_offset', $offset + $batch_size ); + + /** + * Fires when the batch of followers is complete. + * + * @param array $inboxes The inboxes. + * @param string $json The ActivityPub Activity JSON + * @param int $actor_id The actor ID. + * @param int $outbox_item_id The Outbox item ID. + * @param int $batch_size The batch size. + * @param int $offset The offset. + */ + \do_action( 'activitypub_outbox_processing_batch_complete', $inboxes, $json, $outbox_item->post_author, $outbox_item_id, $batch_size, $offset ); + + return array( $outbox_item_id, $batch_size, $offset + $batch_size ); + } + } + + /** + * Retry sending to followers. + * + * @param string $transient_key The key to retrieve retry inboxes. + * @param int $outbox_item_id The Outbox item ID. + * @param int $attempt The attempt number. + */ + public static function retry_send_to_followers( $transient_key, $outbox_item_id, $attempt = 1 ) { + $inboxes = \get_transient( $transient_key ); + if ( false === $inboxes ) { + return; + } + + // Delete the transient as we no longer need it. + \delete_transient( $transient_key ); + + $retries = self::send_to_inboxes( $inboxes, $outbox_item_id ); + + // Retry failed inboxes. + if ( ++$attempt < self::get_retry_max_attempts() && ! empty( $retries ) ) { + self::schedule_retry( $retries, $outbox_item_id, $attempt ); + } + } + + /** + * Send to inboxes. + * + * @param array $inboxes The inboxes to notify. + * @param int $outbox_item_id The Outbox item ID. + * @return array The failed inboxes. + */ + private static function send_to_inboxes( $inboxes, $outbox_item_id ) { + $outbox_item = \get_post( $outbox_item_id ); + + $activity = Outbox::get_activity( $outbox_item_id ); + + if ( \is_wp_error( $activity ) ) { + return array(); + } + + $json = $activity->to_json(); + + $retries = array(); + + /** + * Fires before sending an Activity to inboxes. + * + * @param string $json The ActivityPub Activity JSON. + * @param array $inboxes The inboxes to send to. + * @param int $outbox_item_id The Outbox item ID. + */ + \do_action( 'activitypub_pre_send_to_inboxes', $json, $inboxes, $outbox_item_id ); + + foreach ( $inboxes as $inbox ) { + // Handle local inboxes via internal REST API, remote via HTTP. + if ( is_same_domain( $inbox ) ) { + $result = self::send_to_local_inbox( $inbox, $json ); + } else { + $result = safe_remote_post( $inbox, $json, $outbox_item->post_author ); + } + + if ( \is_wp_error( $result ) && in_array( $result->get_error_code(), self::get_retry_error_codes(), true ) ) { + $retries[] = $inbox; + } + + /** + * Fires after an Activity has been sent to an inbox. + * + * @param array $result The result of the internal or remote post request. + * @param string $inbox The inbox URL. + * @param string $json The ActivityPub Activity JSON. + * @param int $actor_id The actor ID. + * @param int $outbox_item_id The Outbox item ID. + */ + \do_action( 'activitypub_sent_to_inbox', $result, $inbox, $json, $outbox_item->post_author, $outbox_item_id ); + } + + return $retries; + } + + /** + * Send an activity to a local inbox via internal REST API request. + * + * @param string $inbox_url The local inbox URL. + * @param string $json The ActivityPub Activity JSON. + * @return array|\WP_Error The result in the format of a remote post response, or WP_Error on failure. + */ + private static function send_to_local_inbox( $inbox_url, $json ) { + // Parse the inbox URL to extract the REST route. + $path = \wp_parse_url( $inbox_url, PHP_URL_PATH ) ?? ''; + $rest_route = \preg_replace( '#^/' . preg_quote( \rest_get_url_prefix(), '#' ) . '#', '', $path ); + + // Create a REST request. + $request = new \WP_REST_Request( 'POST', $rest_route ); + $request->set_header( 'Content-Type', 'application/activity+json' ); + $request->set_body( $json ); + $request->get_json_params(); + + \add_filter( 'activitypub_defer_signature_verification', '__return_true' ); + $response = \rest_do_request( $request ); + \remove_filter( 'activitypub_defer_signature_verification', '__return_true' ); + + // Return result in format similar to remote post response. + if ( $response->is_error() ) { + return $response->as_error(); + } + + return array( + 'response' => array( + 'code' => $response->get_status(), + ), + 'body' => \wp_json_encode( $response->get_data() ), + ); + } + + /** + * Schedule a retry. + * + * @param array $retries The inboxes to retry. + * @param int $outbox_item_id The Outbox item ID. + * @param int $attempt Optional. The attempt number. Default 1. + */ + private static function schedule_retry( $retries, $outbox_item_id, $attempt = 1 ) { + $transient_key = 'activitypub_retry_' . \wp_generate_password( 12, false ); + \set_transient( $transient_key, $retries, WEEK_IN_SECONDS ); + + \wp_schedule_single_event( + \time() + ( $attempt * $attempt * self::get_retry_delay() ), + 'activitypub_retry_activity', + array( $transient_key, $outbox_item_id, $attempt ) + ); + } + + /** + * Send an Activity to a custom list of inboxes, like mentioned users or replied-to posts. + * + * For all custom implementations, please use the `activitypub_additional_inboxes` filter. + * + * @param Activity $activity The ActivityPub Activity. + * @param int $actor_id The actor ID. + * @param \WP_Post $outbox_item The WordPress object. + */ + private static function send_to_additional_inboxes( $activity, $actor_id, $outbox_item = null ) { + /** + * Filters the list of inboxes to send the Activity to. + * + * @param array $inboxes The list of inboxes to send to. + * @param int $actor_id The actor ID. + * @param Activity $activity The ActivityPub Activity. + */ + $inboxes = apply_filters( 'activitypub_additional_inboxes', array(), $actor_id, $activity ); + $inboxes = array_unique( $inboxes ); + + $retries = self::send_to_inboxes( $inboxes, $outbox_item->ID ); + + // Retry failed inboxes. + if ( ! empty( $retries ) ) { + self::schedule_retry( $retries, $outbox_item->ID ); + } + } + + /** + * Default filter to add Inboxes of Mentioned Actors + * + * @param array $inboxes The list of Inboxes. + * @param int $actor_id The WordPress Actor-ID. + * @param Activity $activity The ActivityPub Activity. + * + * @return array The filtered Inboxes. + */ + public static function add_inboxes_by_mentioned_actors( $inboxes, $actor_id, $activity ) { + $cc = $activity->get_cc() ?? array(); + $to = $activity->get_to() ?? array(); + + $audience = array_merge( $cc, $to ); + + // Remove "public placeholder" from the audience. + $audience = array_diff( $audience, ACTIVITYPUB_PUBLIC_AUDIENCE_IDENTIFIERS ); + + if ( $audience ) { + $mentioned_inboxes = Mention::get_inboxes( $audience ); + + return array_merge( $inboxes, $mentioned_inboxes ); + } + + return $inboxes; + } + + /** + * Default filter to add Inboxes of Posts that are set as `in-reply-to` + * + * @param array $inboxes The list of Inboxes. + * @param int $actor_id The WordPress Actor-ID. + * @param Activity $activity The ActivityPub Activity. + * + * @return array The filtered Inboxes + */ + public static function add_inboxes_of_replied_urls( $inboxes, $actor_id, $activity ) { + $in_reply_to = $activity->get_in_reply_to(); + + if ( ! $in_reply_to ) { + return $inboxes; + } + + if ( ! is_array( $in_reply_to ) ) { + $in_reply_to = array( $in_reply_to ); + } + + foreach ( $in_reply_to as $url ) { + // No need to self-notify. + if ( is_same_domain( $url ) ) { + continue; + } + + $object = Http::get_remote_object( $url ); + + if ( + ! $object || + \is_wp_error( $object ) || + empty( $object['attributedTo'] ) + ) { + continue; + } + + $actor = object_to_uri( $object['attributedTo'] ); + $actor = Http::get_remote_object( $actor ); + + if ( ! $actor || \is_wp_error( $actor ) ) { + continue; + } + + if ( ! empty( $actor['endpoints']['sharedInbox'] ) ) { + $inboxes[] = $actor['endpoints']['sharedInbox']; + } elseif ( ! empty( $actor['inbox'] ) ) { + $inboxes[] = $actor['inbox']; + } + } + + return $inboxes; + } + + /** + * Check if an Activity should be sent to followers. + * + * @param Activity $activity The Activity object. + * @param \Activitypub\Model\User|\Activitypub\Model\Blog $actor The Actor object. + * @param \WP_Post $outbox_item The Outbox item. + * + * @return boolean True if the Activity should be sent to followers, false if not. + */ + protected static function should_send_to_followers( $activity, $actor, $outbox_item ) { + $cc = (array) ( $activity->get_cc() ?? array() ); + $to = (array) ( $activity->get_to() ?? array() ); + $bcc = (array) ( $activity->get_bcc() ?? array() ); + $bto = (array) ( $activity->get_bto() ?? array() ); + + $audience = array_merge( $cc, $to, $bcc, $bto ); + + $send = ( + // Check if activity is public. + is_activity_public( $activity ) || + // ...or check if follower endpoint is set. + in_array( $actor->get_followers(), $audience, true ) + ); + + if ( $send ) { + $followers = Followers::get_inboxes_for_activity( $activity->to_json(), $outbox_item->post_author ); + + // Only send if there are followers to send to. + $send = ! is_countable( $followers ) || 0 < count( $followers ); + } + + /** + * Filters whether to send an Activity to followers. + * + * @param bool $send_activity_to_followers Whether to send the Activity to followers. + * @param Activity $activity The ActivityPub Activity. + * @param int $actor_id The actor ID. + * @param \WP_Post $outbox_item The WordPress object. + */ + return apply_filters( 'activitypub_send_activity_to_followers', $send, $activity, $outbox_item->post_author, $outbox_item ); + } + + /** + * Add Inboxes of Relays. + * + * @param array $inboxes The list of Inboxes. + * @param int $actor_id The Actor-ID. + * @param Activity $activity The ActivityPub Activity. + * + * @return array The filtered Inboxes. + */ + public static function add_inboxes_of_relays( $inboxes, $actor_id, $activity ) { + // Check if activity is public. + if ( ! is_activity_public( $activity ) ) { + return $inboxes; + } + + $relays = \get_option( 'activitypub_relays', array() ); + + if ( empty( $relays ) ) { + return $inboxes; + } + + return array_merge( $inboxes, $relays ); + } + + /** + * Fire outbox handlers for activities. + * + * Triggers activity type-specific handlers to process outbox activities, + * allowing handlers to create WordPress posts or perform other side effects. + * + * @param int $outbox_id The Outbox item ID. + * @param Activity $activity The Activity that was just added to the Outbox. + */ + public static function fire_outbox_handlers( $outbox_id, $activity ) { + $outbox_item = \get_post( $outbox_id ); + + if ( ! $outbox_item ) { + return; + } + + $type = $activity->get_type(); + $user_id = $outbox_item->post_author; + $data = $activity->to_array( false ); + + /** + * Fires when an activity has been added to the outbox. + * + * Handlers can implement side effects like creating WordPress posts. + * + * @param array $data The activity data array. + * @param int $user_id The user ID. + * @param Activity $activity The Activity object. + * @param int $outbox_id The outbox post ID. + */ + \do_action( 'activitypub_handled_outbox_' . \strtolower( $type ), $data, $user_id, $activity, $outbox_id ); + } + + /** + * Send an immediate Accept activity for the given Outbox item. + * + * @param int $outbox_id The Outbox item ID. + * @param Activity $activity The Activity that was just added to the Outbox. + */ + public static function send_immediate_accept( $outbox_id, $activity ) { + $outbox_item = \get_post( $outbox_id ); + + if ( ! $outbox_item || 'Accept' !== $activity->get_type() ) { + return; + } + + // Send to mentioned and replied-to users. Everyone other than followers. + self::send_to_additional_inboxes( $activity, $outbox_item->post_author, $outbox_item ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-embed.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-embed.php new file mode 100644 index 00000000..c06a8be2 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-embed.php @@ -0,0 +1,305 @@ + 'Image', + 'url' => $activity_object['image']['url'], + 'name' => $activity_object['image']['name'] ?? '', + ), + ); + } elseif ( isset( $activity_object['attachment'] ) ) { + foreach ( $activity_object['attachment'] as $attachment ) { + $type = isset( $attachment['mediaType'] ) ? strtok( $attachment['mediaType'], '/' ) : strtolower( $attachment['type'] ); + + switch ( $type ) { + case 'image': + $images[] = $attachment; + break; + case 'video': + $video = $attachment; + break 2; + case 'audio': + $audio = $attachment; + break 2; + } + } + $images = \array_slice( $images, 0, 4 ); + } + + ob_start(); + load_template( + ACTIVITYPUB_PLUGIN_DIR . 'templates/embed.php', + false, + array( + 'audio' => $audio, + 'author_name' => $author_name, + 'author_url' => $author_url, + 'avatar_url' => $avatar_url, + 'boosts' => $boosts, + 'content' => $content, + 'favorites' => $favorites, + 'images' => $images, + 'published' => $published, + 'title' => $title, + 'url' => $activity_object['id'], + 'video' => $video, + 'webfinger' => $author['webfinger'], + ) + ); + + if ( $inline_css ) { + // Grab the CSS. + $css = \file_get_contents( ACTIVITYPUB_PLUGIN_DIR . 'assets/css/activitypub-embed.css' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents + // We embed CSS directly because this may be in an iframe. + printf( '', $css ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + // A little light whitespace cleanup. + return preg_replace( '/\s+/', ' ', ob_get_clean() ); + } + + /** + * Check if a real oEmbed result exists for the given URL. + * + * @param string $url The URL to check. + * @param array $args Additional arguments passed to wp_oembed_get(). + * @return bool True if a real oEmbed result exists, false otherwise. + */ + public static function has_real_oembed( $url, $args = array() ) { + // Temporarily remove our filter to avoid infinite loops. + \remove_filter( 'pre_oembed_result', array( self::class, 'maybe_use_activitypub_embed' ) ); + + // Try to get a "real" oEmbed result. If found, it'll be cached to avoid unnecessary HTTP requests in `wp_oembed_get`. + $oembed_result = \wp_oembed_get( $url, $args ); + + // Add our filter back. + \add_filter( 'pre_oembed_result', array( self::class, 'maybe_use_activitypub_embed' ), 10, 3 ); + + return false !== $oembed_result; + } + + /** + * Filter the oembed result to handle ActivityPub content when no oEmbed is found. + * Implementation is a bit weird because there's no way to filter on a false result, we have to use `pre_oembed_result`. + * + * @param null|string $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. + * @param string $url The URL to the content that should be attempted to be embedded. + * @param array $args Additional arguments passed to wp_oembed_get(). + * @return null|string Return null to allow normal oEmbed processing, or string for ActivityPub embed. + */ + public static function maybe_use_activitypub_embed( $result, $url, $args ) { + // If we already have a result, return it. + if ( null !== $result ) { + return $result; + } + + // If we found a real oEmbed, return null to allow normal processing. + if ( self::has_real_oembed( $url, $args ) ) { + return null; + } + + // No oEmbed found, try to get ActivityPub representation. + $html = get_embed_html( $url ); + + // If we couldn't get an ActivityPub embed either, return null to allow normal processing. + if ( ! $html ) { + return null; + } + + // Return the ActivityPub embed HTML. + return $html; + } + + /** + * Handle cases where WordPress has filtered out the oEmbed result for security reasons, + * but we can provide a safe ActivityPub-specific markup. + * + * This runs after wp_filter_oembed_result has potentially nullified the result. + * + * @param string|false $html The returned oEmbed HTML. + * @param object $data A data object result from an oEmbed provider. + * @param string $url The URL of the content to be embedded. + * @return string|false The filtered oEmbed HTML or our ActivityPub embed. + */ + public static function handle_filtered_oembed_result( $html, $data, $url ) { + // If we already have valid HTML, return it. + if ( $html ) { + return $html; + } + + // If this isn't a rich or video type, we can't help. + if ( ! isset( $data->type ) || ! \in_array( $data->type, array( 'rich', 'video' ), true ) ) { + return $html; + } + + // If there's no HTML in the data, we can't help. + if ( empty( $data->html ) || ! \is_string( $data->html ) ) { + return $html; + } + + // Try to get ActivityPub representation. + $activitypub_html = self::get_html( $url ); + if ( ! $activitypub_html ) { + return $html; + } + + // Return our safer ActivityPub embed HTML. + return $activitypub_html; + } + + /** + * Register the fallback hook for oEmbed requests. + * + * Avoids filtering every single API request. + * + * @param int $post_id The post ID. + * @return int The post ID. + */ + public static function register_fallback_hook( $post_id ) { + \add_filter( 'rest_request_after_callbacks', array( self::class, 'oembed_fediverse_fallback' ), 10, 3 ); + + return $post_id; + } + + /** + * Fallback for oEmbed requests to the Fediverse. + * + * @param \WP_REST_Response|\WP_Error $response Result to send to the client. + * @param array $handler Route handler used for the request. + * @param \WP_REST_Request $request Request used to generate the response. + * + * @return \WP_REST_Response|\WP_Error The response to send to the client. + */ + public static function oembed_fediverse_fallback( $response, $handler, $request ) { + if ( '/oembed/1.0/proxy' !== $request->get_route() ) { + return $response; + } + + if ( ( is_wp_error( $response ) && 'oembed_invalid_url' === $response->get_error_code() ) || empty( $response->html ) ) { + $url = $request->get_param( 'url' ); + $html = self::get_html( $url ); + + if ( $html ) { + $args = $request->get_params(); + $data = (object) array( + 'provider_name' => 'ActivityPub oEmbed', + 'html' => $html, + 'scripts' => array(), + ); + + /** This filter is documented in wp-includes/class-wp-oembed.php */ + $data->html = apply_filters( 'oembed_result', $data->html, $url, $args ); + + /** This filter is documented in wp-includes/class-wp-oembed-controller.php */ + $ttl = apply_filters( 'rest_oembed_ttl', DAY_IN_SECONDS, $url, $args ); + + set_transient( 'oembed_' . md5( serialize( $args ) ), $data, $ttl ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize + + $response = new \WP_REST_Response( $data ); + } + } elseif ( ! empty( $request->get_param( 'activitypub' ) ) ) { + /* + * If the 'activitypub' parameter is present, perform an additional validation step: + * Ensure the provided URL resolves to a valid ActivityPub object. + * + * This differs from the standard oEmbed flow, which does not explicitly validate + * the URL as an ActivityPub object unless the initial oEmbed lookup fails. + * This block is triggered for requests from the Federated Reply block, where we + * want to inform users whether post authors will be notified of the reply. + */ + $object = Http::get_remote_object( $request->get_param( 'url' ) ); + + if ( \is_wp_error( $object ) || ! is_activity_object( $object ) ) { + $response = new \WP_Error( 'oembed_invalid_url', \get_status_header_desc( 404 ), array( 'status' => 404 ) ); + } + } + + return $response; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-emoji.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-emoji.php new file mode 100644 index 00000000..390866ce --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-emoji.php @@ -0,0 +1,277 @@ + \esc_url( $url ) ); + + if ( ! empty( $tag['updated'] ) && \is_string( $tag['updated'] ) && \strtotime( $tag['updated'] ) ) { + $block_attrs['updated'] = \sanitize_text_field( $tag['updated'] ); + } + + $wrapped = \sprintf( + '%s', + \wp_json_encode( $block_attrs ), + $shortcode + ); + + // Case-insensitive replacement, avoid already wrapped shortcodes. + $pattern = '/(?)' . \preg_quote( $shortcode, '/' ) . '(?!)/i'; + $content = \preg_replace_callback( + $pattern, + function () use ( $wrapped ) { + return $wrapped; + }, + $content + ); + } + + return $content; + } + + /** + * Generate an emoji img tag. + * + * @param string $url The emoji image URL. + * @param string $name The emoji name (without colons). + * + * @return string The emoji img tag HTML. + */ + public static function get_img_tag( $url, $name ) { + return \sprintf( + '%s', + \esc_url( $url ), + \esc_attr( $name ), + \esc_attr( $name ) + ); + } + + /** + * Get the allowed HTML structure for emoji img tags. + * + * Used by Comment class for KSES validation of emoji in author names. + * + * @return array The allowed HTML structure for use with wp_kses. + */ + public static function get_kses_allowed_html() { + return array( + 'img' => array( + 'class' => array( + 'required' => true, + 'values' => array( 'emoji' ), + ), + 'src' => array( + 'required' => true, + 'value_callback' => array( self::class, 'validate_emoji_src' ), + ), + 'alt' => array( 'required' => true ), + 'title' => array( 'required' => true ), + 'height' => array( + 'required' => true, + 'values' => array( '20' ), + ), + 'width' => array( + 'required' => true, + 'values' => array( '20' ), + ), + 'draggable' => array( + 'required' => true, + 'values' => array( 'false' ), + ), + ), + ); + } + + /** + * Validate emoji src attribute for wp_kses. + * + * By default, only allows locally cached emoji URLs for privacy. + * Remote URLs are only allowed when caching is explicitly disabled. + * + * @param string $value The src attribute value. + * + * @return bool True if the src is valid, false otherwise. + */ + public static function validate_emoji_src( $value ) { + $upload_dir = \wp_upload_dir(); + $emoji_base = $upload_dir['baseurl'] . '/activitypub/emoji/'; + + // Allow local cached emoji. + if ( \str_starts_with( $value, $emoji_base ) ) { + return true; + } + + // Only allow remote URLs when caching is explicitly disabled. + // This protects user privacy by defaulting to local-only emoji. + $allow_remote = ! Cache::is_enabled(); + + // Validate the URL format if remote is allowed. + if ( $allow_remote ) { + $allow_remote = (bool) \wp_http_validate_url( $value ); + } + + /** + * Filters whether a remote emoji URL is valid. + * + * Use this filter to explicitly allow remote emoji URLs when needed + * (e.g., for CDN proxying). + * + * @since 5.6.0 + * + * @param bool $valid Whether the URL is valid. + * @param string $value The emoji src URL. + */ + return \apply_filters( 'activitypub_validate_emoji_src', $allow_remote, $value ); + } + + /** + * Prepare actor meta for emoji storage. + * + * Used for storing actor emoji data for comment author name rendering. + * + * @param array $actor The actor array containing potential emoji in tags. + * + * @return array Meta input array with emoji data, or empty array if no emoji. + */ + public static function prepare_actor_meta( $actor ) { + if ( empty( $actor['tag'] ) || ! \is_array( $actor['tag'] ) ) { + return array(); + } + + $emoji_tags = \array_values( + \array_filter( + $actor['tag'], + function ( $tag ) { + return \is_array( $tag ) && isset( $tag['type'] ) && 'Emoji' === $tag['type']; + } + ) + ); + + if ( empty( $emoji_tags ) ) { + return array(); + } + + return array( + '_activitypub_emoji' => \wp_json_encode( $emoji_tags ), + ); + } + + /** + * Replace emoji from stored JSON data. + * + * Used for comment author name replacement at display time. + * + * @param string $text The text to process. + * @param string $emoji_json JSON-encoded emoji tag data. + * + * @return string The processed text with emoji replacements. + */ + public static function replace_from_json( $text, $emoji_json ) { + $tags = \json_decode( $emoji_json, true ); + + if ( empty( $tags ) || ! \is_array( $tags ) ) { + return $text; + } + + foreach ( $tags as $tag ) { + if ( empty( $tag['name'] ) ) { + continue; + } + + $url = object_to_uri( $tag['icon'] ?? null ); + if ( empty( $url ) ) { + continue; + } + + /** + * Filters a remote media URL for caching. + * + * @param string $url The remote media URL. + * @param string $context The context ('emoji'). + * @param string|null $entity_id The entity ID. + * @param array $options Additional options. + */ + $cached_url = \apply_filters( + 'activitypub_remote_media_url', + $url, + 'emoji', + null, + array( 'updated' => $tag['updated'] ?? null ) + ); + + $name = \trim( $tag['name'], ':' ); + $img = self::get_img_tag( $cached_url ?: $url, $name ); + + $text = \str_ireplace( $tag['name'], $img, $text ); + } + + return $text; + } + + /** + * Replace emoji in text using a remote actor's stored emoji data. + * + * Used by Mailer class for actor name/summary in emails. + * + * @param string $text The text to process. + * @param string $actor_url The actor's URL to look up emoji data. + * + * @return string The processed text with emoji replacements. + */ + public static function replace_for_actor( $text, $actor_url ) { + $actor_post = Collection\Remote_Actors::get_by_uri( $actor_url ); + if ( ! $actor_post || \is_wp_error( $actor_post ) ) { + return $text; + } + + $emoji_data = \get_post_meta( $actor_post->ID, '_activitypub_emoji', true ); + if ( empty( $emoji_data ) ) { + return $text; + } + + return self::replace_from_json( $text, $emoji_data ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-event-stream.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-event-stream.php new file mode 100644 index 00000000..ffb6cd32 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-event-stream.php @@ -0,0 +1,61 @@ +post_content . "\n" . $post->post_excerpt; + $content = self::extract_text_outside_protected_tags( $content ); + + $tags = array(); + if ( \preg_match_all( '/' . ACTIVITYPUB_HASHTAGS_REGEXP . '/i', $content, $match ) ) { + $tags = \array_unique( $match[1] ); + } + + \wp_add_post_tags( $post->ID, \implode( ', ', $tags ) ); + } + + /** + * Extract text content from outside protected HTML elements. + * + * Uses WP_HTML_Tag_Processor to properly parse HTML and skip content inside + * protected tags, matching the behavior of enrich_content_data(). + * + * @param string $content The HTML content to process. + * + * @return string Text content from non-protected areas only. + */ + private static function extract_text_outside_protected_tags( $content ) { + $processor = new \WP_HTML_Tag_Processor( $content ); + + /* + * Do not process content inside protected tags. + * + * Note: SCRIPT, STYLE, and TEXTAREA are "atomic" elements in + * WP_HTML_Tag_Processor, meaning their content is bundled with the tag + * token and won't appear as separate #text nodes. Because of this they + * do not need to be listed in $protected_tags: their inner text is + * never surfaced as #text tokens for us to process. + * See https://github.com/WordPress/wordpress-develop/blob/0fb3bb29596918864d808d156268a2df63c83620/src/wp-includes/html-api/class-wp-html-tag-processor.php#L276 + */ + $protected_tags = array( 'PRE', 'CODE', 'A' ); + $tag_stack = array(); + $filtered_content = ''; + + while ( $processor->next_token() ) { + $token_type = $processor->get_token_type(); + + if ( '#tag' === $token_type ) { + $tag_name = $processor->get_tag(); + + if ( $processor->is_tag_closer() ) { + // Closing tag: remove from stack. + $i = \array_search( $tag_name, $tag_stack, true ); + if ( false !== $i ) { + $tag_stack = \array_slice( $tag_stack, 0, $i ); + } + } elseif ( \in_array( $tag_name, $protected_tags, true ) ) { + // Opening tag: add to stack. + $tag_stack[] = $tag_name; + } + } elseif ( '#text' === $token_type && empty( $tag_stack ) ) { + // Only include text chunks that are outside protected tags. + $filtered_content .= $processor->get_modifiable_text(); + } + } + + return $filtered_content; + } + + /** + * Filter to replace the #tags in the content with links. + * + * @param string $the_content The post content. + * + * @return string The filtered post content. + */ + public static function the_content( $the_content ) { + return enrich_content_data( $the_content, '/' . ACTIVITYPUB_HASHTAGS_REGEXP . '/i', array( self::class, 'replace_with_links' ) ); + } + + /** + * A callback for preg_replace to build the term links. + * + * @param array $result The preg_match results. + * @return string the final string + */ + public static function replace_with_links( $result ) { + $tag = $result[1]; + $tag_object = \get_term_by( 'name', $tag, 'post_tag' ); + if ( ! $tag_object ) { + $tag_object = \get_term_by( 'name', $tag, 'category' ); + } + + if ( $tag_object ) { + $link = \get_term_link( $tag_object, 'post_tag' ); + return \sprintf( '', esc_url( $link ), $tag ); + } + + return '#' . $tag; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-http.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-http.php new file mode 100644 index 00000000..1ddc0ebb --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-http.php @@ -0,0 +1,316 @@ + $timeout, + 'limit_response_size' => 1048576, + 'redirection' => 3, + 'user-agent' => "$user_agent; ActivityPub", + 'headers' => array( + 'Accept' => 'application/activity+json', + 'Content-Type' => 'application/activity+json', + 'Date' => \gmdate( 'D, d M Y H:i:s T' ), + ), + 'body' => $body, + 'key_id' => \json_decode( $body )->actor . '#main-key', + 'private_key' => Actors::get_private_key( $user_id ), + 'user_id' => $user_id, + ); + + $response = \wp_safe_remote_post( $url, $args ); + $code = \wp_remote_retrieve_response_code( $response ); + + if ( $code >= 400 ) { + $response = new \WP_Error( + $code, + __( 'Failed HTTP Request', 'activitypub' ), + array( + 'status' => $code, + 'response' => $response, + ) + ); + } + + /** + * Action to save the response of the remote POST request. + * + * @param array|\WP_Error $response The response of the remote POST request. + * @param string $url The URL endpoint. + * @param string $body The Post Body. + * @param int $user_id The WordPress User-ID. + */ + \do_action( 'activitypub_safe_remote_post_response', $response, $url, $body, $user_id ); + + return $response; + } + + /** + * Send a GET Request with the needed HTTP Headers. + * + * @param string $url The URL endpoint. + * @param array $args Optional. Additional arguments to customize the request. + * - 'headers': Array of headers to override defaults. + * @param bool|int $cached Optional. Whether to return cached results, or cache duration. Default false. + * + * @return array|\WP_Error The GET Response or a WP_Error. + */ + public static function get( $url, $args = array(), $cached = false ) { + // Backward compatibility: if $args is boolean/int, it's the old $cached parameter. + if ( ! \is_array( $args ) ) { + \_deprecated_argument( + __METHOD__, + '7.9.0', + \esc_html__( 'The $cached parameter should now be passed as the third argument.', 'activitypub' ) + ); + $cached = $args; + $args = array(); + } + + /** + * Fires before an HTTP GET request is made. + * + * @param string $url The URL endpoint. + */ + \do_action( 'activitypub_pre_http_get', $url ); + + $transient_key = self::generate_cache_key( $url ); + + // Check cache only if caching is requested. + if ( $cached ) { + $response = \get_transient( $transient_key ); + + if ( $response ) { + /** + * Action to save the response of the remote GET request. + * + * @param array|\WP_Error $response The response of the remote GET request. + * @param string $url The URL endpoint. + */ + \do_action( 'activitypub_safe_remote_get_response', $response, $url ); + + return $response; + } + } + + /** + * Filters the HTTP headers user agent string. + * + * @param string $user_agent The user agent string. + * @param string $url The request URL. + */ + $user_agent = \apply_filters( 'http_headers_useragent', 'WordPress/' . get_masked_wp_version() . '; ' . \get_bloginfo( 'url' ), $url ); + + /** + * Filters the timeout duration for remote GET requests in ActivityPub. + * + * @param int $timeout The timeout value in seconds. Default 10 seconds. + */ + $timeout = \apply_filters( 'activitypub_remote_get_timeout', 10 ); + + $defaults = array( + 'timeout' => $timeout, + 'limit_response_size' => 1048576, + 'redirection' => 3, + 'user-agent' => "$user_agent; ActivityPub", + 'headers' => array( + 'Accept' => 'application/activity+json', + 'Content-Type' => 'application/activity+json', + 'Date' => \gmdate( 'D, d M Y H:i:s T' ), + ), + 'key_id' => Actors::get_by_id( Actors::APPLICATION_USER_ID )->get_id() . '#main-key', + 'private_key' => Actors::get_private_key( Actors::APPLICATION_USER_ID ), + ); + + $args = \wp_parse_args( $args, $defaults ); + $args['headers'] = \wp_parse_args( $args['headers'], $defaults['headers'] ); + + $response = \wp_safe_remote_get( $url, $args ); + $code = \wp_remote_retrieve_response_code( $response ); + + if ( \is_wp_error( $response ) || $code >= 400 ) { + if ( ! $code ) { + $code = 0; + } + $response = new \WP_Error( $code, __( 'Failed HTTP Request', 'activitypub' ), array( 'status' => $code ) ); + + /* + * Always cache errors to prevent repeated timeout waits. + * - Retriable errors (timeouts, 5xx): 1 minute (server may recover quickly). + * - Other errors (4xx): 15 minutes (client errors are more permanent). + */ + if ( \in_array( $code, ACTIVITYPUB_RETRY_ERROR_CODES, true ) || 0 === $code ) { + $cache_duration = MINUTE_IN_SECONDS; + } else { + $cache_duration = 15 * MINUTE_IN_SECONDS; + } + + \set_transient( $transient_key, $response, $cache_duration ); + + return $response; + } + + /** + * Action to save the response of the remote GET request. + * + * @param array|\WP_Error $response The response of the remote GET request. + * @param string $url The URL endpoint. + */ + \do_action( 'activitypub_safe_remote_get_response', $response, $url ); + + // Always cache successful responses. + $cache_duration = $cached; + if ( ! is_int( $cache_duration ) ) { + $cache_duration = HOUR_IN_SECONDS; + } + \set_transient( $transient_key, $response, $cache_duration ); + + return $response; + } + + /** + * Check for URL for Tombstone. + * + * @param string $url The URL to check. + * + * @return bool True if the URL is a tombstone. + */ + public static function is_tombstone( $url ) { + _deprecated_function( __METHOD__, '7.3.0', 'Activitypub\Tombstone::exists_remote' ); + + return Tombstone::exists_remote( $url ); + } + + /** + * Generate a cache key for the URL. + * + * @param string $url The URL to generate the cache key for. + * + * @return string The cache key. + */ + public static function generate_cache_key( $url ) { + return 'activitypub_http_' . \md5( $url ); + } + + /** + * Requests the Data from the Object-URL or Object-Array. + * + * @param array|string $url_or_object The Object or the Object URL. + * @param bool $cached Optional. Whether the result should be cached. Default true. + * + * @return array|\WP_Error The Object data as array or WP_Error on failure. + */ + public static function get_remote_object( $url_or_object, $cached = true ) { + /** + * Filters the preemptive return value of a remote object request. + * + * @param array|string|null $response The response. + * @param array|string|null $url_or_object The Object or the Object URL. + */ + $response = apply_filters( 'activitypub_pre_http_get_remote_object', null, $url_or_object ); + if ( null !== $response ) { + return $response; + } + + $url = object_to_uri( $url_or_object ); + + if ( Webfinger::is_acct( $url ) ) { + $url = Webfinger::resolve( $url ); + } + + if ( ! $url ) { + return new \WP_Error( + 'activitypub_no_valid_actor_identifier', + \__( 'The "actor" identifier is not valid', 'activitypub' ), + array( + 'status' => 404, + 'object' => $url, + ) + ); + } + + if ( \is_wp_error( $url ) ) { + return $url; + } + + if ( ! \wp_http_validate_url( $url ) ) { + return new \WP_Error( + 'activitypub_no_valid_object_url', + \__( 'The "object" is/has no valid URL', 'activitypub' ), + array( + 'status' => 400, + 'object' => $url, + ) + ); + } + + $response = self::get( $url, array(), $cached ); + + if ( \is_wp_error( $response ) ) { + return $response; + } + + $data = \wp_remote_retrieve_body( $response ); + $data = \json_decode( $data, true ); + + if ( ! $data ) { + return new \WP_Error( + 'activitypub_invalid_json', + \__( 'No valid JSON data', 'activitypub' ), + array( + 'status' => 400, + 'object' => $url, + ) + ); + } + + return $data; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-link.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-link.php new file mode 100644 index 00000000..cb9e68a5 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-link.php @@ -0,0 +1,129 @@ +%s', + esc_url( $result[0] ), + $rel, + esc_html( $invisible_prefix ), + $display_class, + esc_html( $display ), + esc_html( $invisible_suffix ) + ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mailer.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mailer.php new file mode 100644 index 00000000..7be76afe --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mailer.php @@ -0,0 +1,550 @@ +comment_ID, 'protocol', true ); + + if ( 'activitypub' !== $type ) { + return $subject; + } + + $singular = Comment::get_comment_type_attr( $comment->comment_type, 'singular' ); + + if ( ! $singular ) { + return $subject; + } + + $post = \get_post( $comment->comment_post_ID ); + + /* translators: 1: Blog name, 2: Like or Repost, 3: Post title */ + return \sprintf( \esc_html__( '[%1$s] %2$s: %3$s', 'activitypub' ), \esc_html( get_option( 'blogname' ) ), \esc_html( $singular ), \esc_html( $post->post_title ) ); + } + + /** + * Filter the notification text for Like and Announce notifications. + * + * @param string $message The default notification text. + * @param int|string $comment_id The comment ID. + * + * @return string The filtered notification text. + */ + public static function comment_notification_text( $message, $comment_id ) { + $comment = \get_comment( $comment_id ); + + if ( ! $comment ) { + return $message; + } + + $type = \get_comment_meta( $comment->comment_ID, 'protocol', true ); + + if ( 'activitypub' !== $type ) { + return $message; + } + + $comment_type = Comment::get_comment_type( $comment->comment_type ); + + if ( ! $comment_type ) { + return $message; + } + + $post = \get_post( $comment->comment_post_ID ); + $comment_author_domain = ''; + + // Only attempt to resolve hostname if we have a valid IP address. + if ( \filter_var( $comment->comment_author_IP, FILTER_VALIDATE_IP ) ) { + $comment_author_domain = \gethostbyaddr( $comment->comment_author_IP ); + } + + // Check if this is a reaction to a post or a comment. + if ( 0 === (int) $comment->comment_parent ) { + $notify_message = \sprintf( + /* translators: 1: Comment type, 2: Post title */ + \html_entity_decode( esc_html__( 'New %1$s on your post “%2$s”.', 'activitypub' ) ), + \esc_html( $comment_type['singular'] ), + \esc_html( $post->post_title ) + ) . PHP_EOL . PHP_EOL; + + } else { + $parent_comment = \get_comment( $comment->comment_parent ); + $notify_message = \sprintf( + /* translators: 1: Comment type, 2: Post title, 3: Parent comment author */ + \html_entity_decode( esc_html__( 'New %1$s on your post “%2$s” in reply to %3$s’s comment.', 'activitypub' ) ), + \esc_html( $comment_type['singular'] ), + \esc_html( $post->post_title ), + \esc_html( $parent_comment->comment_author ) + ) . PHP_EOL . PHP_EOL; + } + + /* translators: 1: Website name, 2: Website IP address, 3: Website hostname. */ + $notify_message .= \sprintf( \esc_html__( 'From: %1$s (IP address: %2$s, %3$s)', 'activitypub' ), \esc_html( $comment->comment_author ), \esc_html( $comment->comment_author_IP ), \esc_html( $comment_author_domain ) ) . "\r\n"; + /* translators: Reaction author URL. */ + $notify_message .= \sprintf( \esc_html__( 'URL: %s', 'activitypub' ), \esc_url( $comment->comment_author_url ) ) . "\r\n\r\n"; + /* translators: Comment type label */ + $notify_message .= \sprintf( \esc_html__( 'You can see all %s on this post here:', 'activitypub' ), \esc_html( $comment_type['label'] ) ) . "\r\n"; + $notify_message .= \get_permalink( $comment->comment_post_ID ) . '#' . \esc_attr( $comment_type['type'] ) . "\r\n\r\n"; + + return $notify_message; + } + + /** + * Send a notification email for every new follower. + * + * @param array $activity The activity object. + * @param int|int[] $user_ids The id(s) of the local blog-user(s). + * @param bool $success True on success, false otherwise. + */ + public static function new_follower( $activity, $user_ids, $success ) { + // Only send notification if the follow was successful. + if ( ! $success ) { + return; + } + + // Extract the user ID (follows are always for a single user). + $user_id = \is_array( $user_ids ) ? \reset( $user_ids ) : $user_ids; + + // Do not send notifications to the Application user. + if ( Actors::APPLICATION_USER_ID === $user_id ) { + return; + } + + if ( $user_id > Actors::BLOG_USER_ID ) { + if ( ! \get_user_option( 'activitypub_mailer_new_follower', $user_id ) ) { + return; + } + + $email = \get_userdata( $user_id )->user_email; + $admin_url = '/users.php?page=activitypub-followers-list'; + } else { + if ( '1' !== \get_option( 'activitypub_blog_user_mailer_new_follower', '1' ) ) { + return; + } + + $email = \get_option( 'admin_email' ); + $admin_url = '/options-general.php?page=activitypub&tab=followers'; + } + + $actor = get_remote_metadata_by_actor( $activity['actor'] ); + if ( ! $actor || \is_wp_error( $actor ) ) { + return; + } + + $actor = self::normalize_actor( $actor ); + + // Replace emoji in actor name and summary. + if ( ! empty( $actor['name'] ) ) { + $actor['name'] = Emoji::replace_for_actor( $actor['name'], $actor['url'] ); + } + if ( ! empty( $actor['summary'] ) ) { + $actor['summary'] = Emoji::replace_for_actor( $actor['summary'], $actor['url'] ); + } + + $template_args = array_merge( + $actor, + array( + 'admin_url' => $admin_url, + 'user_id' => $user_id, + 'stats' => array( + 'outbox' => null, + 'followers' => null, + 'following' => null, + ), + ) + ); + + foreach ( $template_args['stats'] as $field => $value ) { + if ( empty( $actor[ $field ] ) ) { + continue; + } + + $result = Http::get( $actor[ $field ], array(), true ); + if ( 200 === \wp_remote_retrieve_response_code( $result ) ) { + $body = \json_decode( \wp_remote_retrieve_body( $result ), true ); + if ( isset( $body['totalItems'] ) ) { + $template_args['stats'][ $field ] = $body['totalItems']; + } + } + } + + /* translators: 1: Blog name, 2: Follower name */ + $subject = \sprintf( \__( '[%1$s] New Follower: %2$s', 'activitypub' ), \get_option( 'blogname' ), $actor['name'] ); + + \ob_start(); + \load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/emails/new-follower.php', false, $template_args ); + $html_message = \ob_get_clean(); + + $alt_function = static function ( $mailer ) use ( $actor, $admin_url ) { + /* translators: 1: Follower name */ + $message = \sprintf( \__( 'New Follower: %1$s.', 'activitypub' ), $actor['name'] ) . "\r\n\r\n"; + /* translators: Follower URL */ + $message .= \sprintf( \__( 'URL: %s', 'activitypub' ), \esc_url( $actor['url'] ) ) . "\r\n\r\n"; + $message .= \__( 'You can see all followers here:', 'activitypub' ) . "\r\n"; + $message .= \esc_url( \admin_url( $admin_url ) ) . "\r\n\r\n"; + $mailer->{'AltBody'} = $message; + }; + \add_action( 'phpmailer_init', $alt_function ); + + \wp_mail( $email, $subject, $html_message, array( 'Content-type: text/html' ) ); + + \remove_action( 'phpmailer_init', $alt_function ); + } + + /** + * Send a direct message. + * + * @param array $activity The activity object. + * @param int|int[] $user_ids The id(s) of the local blog-user(s). + */ + public static function direct_message( $activity, $user_ids ) { + // Early return if activity is public or has no recipients. + if ( is_activity_public( $activity ) || empty( $activity['to'] ) ) { + return; + } + + // Normalize to array. + $user_ids = (array) $user_ids; + + // Build a map of user_id => actor_id and filter to only users in the "to" field. + $recipients = array(); + foreach ( $user_ids as $user_id ) { + $actor = Actors::get_by_id( $user_id ); + if ( \is_wp_error( $actor ) ) { + continue; + } + + $actor_id = $actor->get_id(); + if ( \in_array( $actor_id, (array) $activity['to'], true ) ) { + $recipients[ $user_id ] = $actor_id; + } + } + + // No matching recipients. + if ( empty( $recipients ) ) { + return; + } + + // Get actor metadata once (shared for all emails). + $actor = get_remote_metadata_by_actor( $activity['actor'] ); + if ( ! $actor || \is_wp_error( $actor ) || empty( $activity['object']['content'] ) ) { + return; + } + + $actor = self::normalize_actor( $actor ); + + // Send email to each recipient. + foreach ( $recipients as $user_id => $actor_id ) { + // Check user preferences. + if ( $user_id > Actors::BLOG_USER_ID ) { + if ( ! \get_user_option( 'activitypub_mailer_new_dm', $user_id ) ) { + continue; + } + + $email = \get_userdata( $user_id )->user_email; + } else { + if ( '1' !== \get_option( 'activitypub_blog_user_mailer_new_dm', '1' ) ) { + continue; + } + + $email = \get_option( 'admin_email' ); + } + + $template_args = array( + 'activity' => $activity, + 'actor' => $actor, + 'user_id' => $user_id, + ); + + /* translators: 1: Blog name, 2 Actor name */ + $subject = \sprintf( \esc_html__( '[%1$s] Direct Message from: %2$s', 'activitypub' ), \esc_html( \get_option( 'blogname' ) ), \esc_html( $actor['name'] ) ); + + \ob_start(); + \load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/emails/new-dm.php', false, $template_args ); + $html_message = \ob_get_clean(); + + $alt_function = static function ( $mailer ) use ( $actor, $activity ) { + $content = \html_entity_decode( + \wp_strip_all_tags( + str_replace( '

', PHP_EOL . PHP_EOL, $activity['object']['content'] ) + ), + ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 + ); + + /* translators: Actor name */ + $message = \sprintf( \esc_html__( 'New Direct Message: %s', 'activitypub' ), $content ) . "\r\n\r\n"; + /* translators: Actor name */ + $message .= \sprintf( \esc_html__( 'From: %s', 'activitypub' ), \esc_html( $actor['name'] ) ) . "\r\n"; + /* translators: Message URL */ + $message .= \sprintf( \esc_html__( 'URL: %s', 'activitypub' ), \esc_url( $activity['object']['id'] ) ) . "\r\n\r\n"; + + $mailer->{'AltBody'} = $message; + }; + \add_action( 'phpmailer_init', $alt_function ); + + \wp_mail( $email, $subject, $html_message, array( 'Content-type: text/html' ) ); + + \remove_action( 'phpmailer_init', $alt_function ); + } + } + + /** + * Send a mention notification. + * + * @param array $activity The activity object. + * @param int|int[] $user_ids The id(s) of the local blog-user(s). + */ + public static function mention( $activity, $user_ids ) { + // Early return if activity has no mentions. + if ( empty( $activity['object']['tag'] ) ) { + return; + } + + // Do not send a mention notification if the activity is a reply to a local post or comment. + if ( is_activity_reply( $activity ) && object_id_to_comment( $activity['object']['id'] ) ) { + return; + } + + $recipients = array(); + $mentions = wp_list_filter( (array) $activity['object']['tag'], array( 'type' => 'Mention' ) ); + $mentions = array_map( '\Activitypub\object_to_uri', $mentions ); + foreach ( (array) $user_ids as $user_id ) { + $actor = Actors::get_by_id( $user_id ); + if ( \is_wp_error( $actor ) ) { + continue; + } + + $actor_id = $actor->get_id(); + if ( \in_array( $actor_id, $mentions, true ) ) { + $recipients[ $user_id ] = $actor_id; + } + } + + // No matching recipients. + if ( empty( $recipients ) ) { + return; + } + + // Get actor metadata once (shared for all emails). + $actor = get_remote_metadata_by_actor( $activity['actor'] ); + if ( \is_wp_error( $actor ) ) { + return; + } + + $actor = self::normalize_actor( $actor ); + + // Send email to each recipient. + foreach ( $recipients as $user_id => $actor_id ) { + // Check user preferences. + if ( $user_id > Actors::BLOG_USER_ID ) { + if ( ! \get_user_option( 'activitypub_mailer_new_mention', $user_id ) ) { + continue; + } + + $email = \get_userdata( $user_id )->user_email; + } else { + if ( '1' !== \get_option( 'activitypub_blog_user_mailer_new_mention', '1' ) ) { + continue; + } + + $email = \get_option( 'admin_email' ); + } + + $template_args = array( + 'activity' => $activity, + 'actor' => $actor, + 'user_id' => $user_id, + ); + + /* translators: 1: Blog name, 2 Actor name */ + $subject = \sprintf( \esc_html__( '[%1$s] Mention from: %2$s', 'activitypub' ), \esc_html( \get_option( 'blogname' ) ), \esc_html( $actor['name'] ) ); + + \ob_start(); + \load_template( ACTIVITYPUB_PLUGIN_DIR . 'templates/emails/new-mention.php', false, $template_args ); + $html_message = \ob_get_clean(); + + $alt_function = static function ( $mailer ) use ( $actor, $activity ) { + $content = \html_entity_decode( + \wp_strip_all_tags( + str_replace( '

', PHP_EOL . PHP_EOL, $activity['object']['content'] ) + ), + ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 + ); + + /* translators: Message content */ + $message = \sprintf( \esc_html__( 'New Mention: %s', 'activitypub' ), $content ) . "\r\n\r\n"; + /* translators: Actor name */ + $message .= \sprintf( \esc_html__( 'From: %s', 'activitypub' ), \esc_html( $actor['name'] ) ) . "\r\n"; + /* translators: Message URL */ + $message .= \sprintf( \esc_html__( 'URL: %s', 'activitypub' ), \esc_url( $activity['object']['id'] ) ) . "\r\n\r\n"; + + $mailer->{'AltBody'} = $message; + }; + \add_action( 'phpmailer_init', $alt_function ); + + \wp_mail( $email, $subject, $html_message, array( 'Content-type: text/html' ) ); + + \remove_action( 'phpmailer_init', $alt_function ); + } + } + + /** + * Send a templated email to a user. + * + * @param int $user_id The user ID (or BLOG_USER_ID for blog actor). + * @param string $subject The email subject. + * @param string $template The template name (without path/extension). + * @param array $args Template arguments. + * @param string $alt_body Optional plain text alternative. Auto-generated from HTML if empty. + * + * @return bool True if email was sent, false otherwise. + */ + public static function send( $user_id, $subject, $template, $args = array(), $alt_body = '' ) { + // Get the recipient email address. + if ( $user_id > Actors::BLOG_USER_ID ) { + $user = \get_userdata( $user_id ); + if ( ! $user || empty( $user->user_email ) ) { + return false; + } + $email = $user->user_email; + } else { + $email = \get_option( 'admin_email' ); + } + + // Load the HTML template. + $template_file = ACTIVITYPUB_PLUGIN_DIR . 'templates/emails/' . \sanitize_file_name( $template ) . '.php'; + + /** + * Filter the email template file path. + * + * @param string $template_file The template file path. + * @param string $template The template name. + * @param int $user_id The user ID. + * @param array $args Template arguments. + */ + $template_file = \apply_filters( 'activitypub_email_template', $template_file, $template, $user_id, $args ); + + if ( ! \file_exists( $template_file ) ) { + return false; + } + + \ob_start(); + \load_template( $template_file, false, $args ); + $html_message = \ob_get_clean(); + + // Build plain text alternative from HTML if not provided. + if ( empty( $alt_body ) ) { + $alt_body = \wp_strip_all_tags( $html_message ); + } + $alt_function = static function ( $mailer ) use ( $alt_body ) { + $mailer->{'AltBody'} = $alt_body; + }; + \add_action( 'phpmailer_init', $alt_function ); + + $result = \wp_mail( $email, $subject, $html_message, array( 'Content-type: text/html' ) ); + + \remove_action( 'phpmailer_init', $alt_function ); + + return $result; + } + + /** + * Apply defaults to the actor object. + * + * Ensure that the actor object has a name, url, and webfinger. + * + * @param array $actor The actor object. + * + * @return array The inflated actor object. + */ + private static function normalize_actor( $actor ) { + if ( empty( $actor['name'] ) ) { + $actor['name'] = $actor['preferredUsername']; + } + + if ( empty( $actor['url'] ) ) { + $actor['url'] = $actor['id']; + } + $actor['url'] = object_to_uri( $actor['url'] ); + + if ( empty( $actor['webfinger'] ) ) { + $actor['webfinger'] = '@' . ( $actor['preferredUsername'] ?? $actor['name'] ) . '@' . \wp_parse_url( $actor['url'], PHP_URL_HOST ); + } + + return $actor; + } + + /** + * Maybe prevent email notifications for comments. + * + * This filter can prevent both post author and moderator notifications + * for comments on specific post types, such as ActivityPub custom post types. + * + * @param bool $maybe_notify Whether to send the notification. + * @param int $comment_id The comment ID. + * + * @return bool False to prevent notification, original value otherwise. + */ + public static function maybe_prevent_comment_notification( $maybe_notify, $comment_id ) { + // If already disabled, respect that. + if ( ! $maybe_notify ) { + return $maybe_notify; + } + + $comment = \get_comment( $comment_id ); + if ( ! $comment ) { + return $maybe_notify; + } + + $post = \get_post( $comment->comment_post_ID ); + if ( ! $post ) { + return $maybe_notify; + } + + // Prevent notifications for comments on ap_post. + if ( is_ap_post( $post ) ) { + return false; + } + + return $maybe_notify; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mention.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mention.php new file mode 100644 index 00000000..41a25e4d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-mention.php @@ -0,0 +1,150 @@ +get_preferred_username() ?: $actor->get_name() ?: Sanitize::webfinger( $result[0] ); + $url = object_to_uri( $actor->get_url() ?: $actor->get_id() ); + + return \sprintf( '@%2$s', esc_url( $url ), esc_html( $username ) ); + } + + /** + * Get the Inboxes for the mentioned Actors. + * + * @param array $mentioned The list of Actors that were mentioned. + * + * @return array The list of Inboxes. + */ + public static function get_inboxes( $mentioned ) { + $inboxes = array(); + + foreach ( $mentioned as $actor ) { + $inbox = self::get_inbox_by_mentioned_actor( $actor ); + + if ( ! is_wp_error( $inbox ) && $inbox ) { + $inboxes[] = $inbox; + } + } + + return $inboxes; + } + + /** + * Get the inbox from the Remote-Profile of a mentioned Actor. + * + * @param string $actor The Actor URL. + * + * @return string|\WP_Error The Inbox-URL or WP_Error if not found. + */ + public static function get_inbox_by_mentioned_actor( $actor ) { + $metadata = get_remote_metadata_by_actor( $actor ); + + if ( \is_wp_error( $metadata ) ) { + return $metadata; + } + + if ( isset( $metadata['endpoints']['sharedInbox'] ) ) { + return $metadata['endpoints']['sharedInbox']; + } + + if ( \array_key_exists( 'inbox', $metadata ) ) { + return $metadata['inbox']; + } + + return new \WP_Error( 'activitypub_no_inbox', \__( 'No "Inbox" found', 'activitypub' ), $metadata ); + } + + /** + * Extract the mentions from the post_content. + * + * @param array $mentions The already found mentions. + * @param string $post_content The post content. + * + * @return array The discovered mentions. + */ + public static function extract_mentions( $mentions, $post_content ) { + \preg_match_all( '/@' . ACTIVITYPUB_USERNAME_REGEXP . '/i', $post_content, $matches ); + foreach ( $matches[0] as $match ) { + $link = Webfinger::resolve( $match ); + if ( ! is_wp_error( $link ) ) { + $mentions[ $match ] = $link; + } + } + return \array_unique( $mentions ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-migration.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-migration.php new file mode 100644 index 00000000..7c4c7df8 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-migration.php @@ -0,0 +1,1333 @@ +query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", 'activitypub_migration_lock', \time() ) ); // phpcs:ignore WordPress.DB + + if ( ! $lock_result ) { + $lock_result = \get_option( 'activitypub_migration_lock' ); + } + + return $lock_result; + } + + /** + * Unlocks the database migration process. + */ + public static function unlock() { + \delete_option( 'activitypub_migration_lock' ); + } + + /** + * Whether the database migration process is locked. + * + * @return boolean + */ + public static function is_locked() { + $lock = \get_option( 'activitypub_migration_lock' ); + + if ( ! $lock ) { + return false; + } + + $lock = (int) $lock; + + if ( $lock < \time() - 1800 ) { + self::unlock(); + return false; + } + + return true; + } + + /** + * Whether the database structure is up to date. + * + * @return bool True if the database structure is up to date, false otherwise. + */ + public static function is_latest_version() { + return (bool) \version_compare( + self::get_version(), + ACTIVITYPUB_PLUGIN_VERSION, + '==' + ); + } + + /** + * Updates the database structure if necessary. + */ + public static function maybe_migrate() { + if ( self::is_latest_version() ) { + return; + } + + if ( self::is_locked() ) { + return; + } + + self::lock(); + + $version_from_db = self::get_version(); + + // Check for initial migration. + if ( ! $version_from_db ) { + self::add_default_settings(); + $version_from_db = ACTIVITYPUB_PLUGIN_VERSION; + } + + if ( \version_compare( $version_from_db, '0.17.0', '<' ) ) { + self::migrate_from_0_16(); + } + if ( \version_compare( $version_from_db, '1.0.0', '<' ) ) { + \wp_schedule_single_event( \time(), 'activitypub_migrate_from_0_17' ); + } + if ( \version_compare( $version_from_db, '1.3.0', '<' ) ) { + self::migrate_from_1_2_0(); + } + if ( \version_compare( $version_from_db, '2.1.0', '<' ) ) { + self::migrate_from_2_0_0(); + } + if ( \version_compare( $version_from_db, '2.3.0', '<' ) ) { + self::migrate_from_2_2_0(); + } + if ( \version_compare( $version_from_db, '3.0.0', '<' ) ) { + self::migrate_from_2_6_0(); + } + if ( \version_compare( $version_from_db, '4.0.0', '<' ) ) { + self::migrate_to_4_0_0(); + } + if ( \version_compare( $version_from_db, '4.1.0', '<' ) ) { + self::migrate_to_4_1_0(); + } + if ( \version_compare( $version_from_db, '4.5.0', '<' ) ) { + \wp_schedule_single_event( \time() + MINUTE_IN_SECONDS, 'activitypub_update_comment_counts' ); + } + if ( \version_compare( $version_from_db, '4.7.1', '<' ) ) { + self::migrate_to_4_7_1(); + } + if ( \version_compare( $version_from_db, '4.7.2', '<' ) ) { + self::migrate_to_4_7_2(); + } + if ( \version_compare( $version_from_db, '5.0.0', '<' ) ) { + Scheduler::register_schedules(); + \wp_schedule_single_event( \time(), 'activitypub_create_post_outbox_items' ); + \wp_schedule_single_event( \time() + 15, 'activitypub_create_comment_outbox_items' ); + } + if ( \version_compare( $version_from_db, '5.4.0', '<' ) ) { + \wp_schedule_single_event( \time(), 'activitypub_upgrade', array( 'update_actor_json_slashing' ) ); + \wp_schedule_single_event( \time(), 'activitypub_upgrade', array( 'update_comment_author_emails' ) ); + } + if ( \version_compare( $version_from_db, '5.7.0', '<' ) ) { + self::delete_mastodon_api_orphaned_extra_fields(); + } + if ( \version_compare( $version_from_db, '5.8.0', '<' ) ) { + self::update_notification_options(); + } + if ( \version_compare( $version_from_db, '6.0.0', '<' ) ) { + self::migrate_followers_to_ap_actor_cpt(); + \wp_schedule_single_event( \time(), 'activitypub_upgrade', array( 'update_actor_json_storage' ) ); + } + if ( \version_compare( $version_from_db, '6.0.1', '<' ) ) { + self::migrate_followers_to_ap_actor_cpt(); + \wp_schedule_single_event( \time(), 'activitypub_upgrade', array( 'update_actor_json_storage' ) ); + } + if ( \version_compare( $version_from_db, '7.0.0', '<' ) ) { + wp_unschedule_hook( 'activitypub_update_followers' ); + wp_unschedule_hook( 'activitypub_cleanup_followers' ); + + if ( ! \wp_next_scheduled( 'activitypub_update_remote_actors' ) ) { + \wp_schedule_event( time(), 'hourly', 'activitypub_update_remote_actors' ); + } + + if ( ! \wp_next_scheduled( 'activitypub_cleanup_remote_actors' ) ) { + \wp_schedule_event( time(), 'daily', 'activitypub_cleanup_remote_actors' ); + } + } + if ( \version_compare( $version_from_db, '7.3.0', '<' ) ) { + self::remove_pending_application_user_follow_requests(); + } + if ( \version_compare( $version_from_db, '7.5.0', '<' ) ) { + self::sync_jetpack_following_meta(); + } + if ( \version_compare( $version_from_db, '7.6.0', '<' ) ) { + self::clean_up_inbox(); + \wp_schedule_single_event( \time(), 'activitypub_migrate_avatar_to_remote_actors' ); + } + if ( \version_compare( $version_from_db, '7.9.0', '<' ) ) { + \wp_schedule_single_event( \time(), 'activitypub_migrate_actor_emoji' ); + } + if ( \version_compare( $version_from_db, '8.1.0', '<' ) && ! \wp_next_scheduled( 'activitypub_backfill_statistics' ) ) { + // Backfill historical statistics data (delay + jitter to avoid load spikes on hosts running many sites). + \wp_schedule_single_event( \time() + HOUR_IN_SECONDS + \wp_rand( 0, 6 * HOUR_IN_SECONDS ), 'activitypub_backfill_statistics' ); + } + if ( \version_compare( $version_from_db, '8.3.0', '<' ) ) { + if ( ! \wp_next_scheduled( 'activitypub_tombstone_migrate' ) ) { + \wp_schedule_single_event( \time() + MINUTE_IN_SECONDS, 'activitypub_tombstone_migrate' ); + } + } + + /* + * Defer the flush to late in the `init` cycle (priority 20). Migration::init + * runs at priority 1, which is earlier than most plugins register their + * rewrite rules. Flushing synchronously here would persist a truncated + * ruleset that omits third-party rules added on `init` at priority 10. + */ + \add_action( 'init', array( Activitypub::class, 'flush_rewrite_rules' ), 20 ); + + // Ensure all required cron schedules are registered. + Scheduler::register_schedules(); + + /* + * Add new update routines above this comment. ^ + * + * Use 'unreleased' as the version number for new migrations and add tests for the callback directly. + * The release script will automatically replace it with the actual version number. + * Example: + * + * if ( \version_compare( $version_from_db, 'unreleased', '<' ) ) { + * // Update routine. + * } + */ + + /** + * Fires when the system has to be migrated. + * + * @param string $version_from_db The version from which to migrate. + * @param string $target_version The target version to migrate to. + */ + \do_action( 'activitypub_migrate', $version_from_db, ACTIVITYPUB_PLUGIN_VERSION ); + + \update_option( 'activitypub_db_version', ACTIVITYPUB_PLUGIN_VERSION ); + + self::unlock(); + } + + /** + * Updates the custom template to use shortcodes instead of the deprecated templates. + */ + private static function migrate_from_0_16() { + // Get the custom template. + $old_content = \get_option( 'activitypub_custom_post_content', ACTIVITYPUB_CUSTOM_POST_CONTENT ); + + /* + * If the old content exists but is a blank string, we're going to need a flag to updated it even + * after setting it to the default contents. + */ + $need_update = false; + + // If the old contents is blank, use the defaults. + if ( '' === $old_content ) { + $old_content = ACTIVITYPUB_CUSTOM_POST_CONTENT; + $need_update = true; + } + + // Set the new content to be the old content. + $content = $old_content; + + // Convert old templates to shortcodes. + $content = \str_replace( '%title%', '[ap_title]', $content ); + $content = \str_replace( '%excerpt%', '[ap_excerpt]', $content ); + $content = \str_replace( '%content%', '[ap_content]', $content ); + $content = \str_replace( '%permalink%', '[ap_permalink type="html"]', $content ); + $content = \str_replace( '%shortlink%', '[ap_shortlink type="html"]', $content ); + $content = \str_replace( '%hashtags%', '[ap_hashtags]', $content ); + $content = \str_replace( '%tags%', '[ap_hashtags]', $content ); + + // Store the new template if required. + if ( $content !== $old_content || $need_update ) { + \update_option( 'activitypub_custom_post_content', $content ); + } + } + + /** + * Updates the DB-schema of the followers-list. + */ + public static function migrate_from_0_17() { + // Migrate followers. + foreach ( get_users( array( 'fields' => 'ID' ) ) as $user_id ) { + $followers = get_user_meta( $user_id, 'activitypub_followers', true ); + + if ( $followers ) { + foreach ( $followers as $actor ) { + Followers::add( $user_id, $actor ); + } + } + } + } + + /** + * Clear the cache after updating to 1.3.0. + */ + private static function migrate_from_1_2_0() { + $user_ids = \get_users( + array( + 'fields' => 'ID', + 'capability__in' => array( 'publish_posts' ), + ) + ); + + foreach ( $user_ids as $user_id ) { + wp_cache_delete( sprintf( Followers::CACHE_KEY_INBOXES, $user_id ), 'activitypub' ); + } + } + + /** + * Unschedule Hooks after updating to 2.0.0. + */ + private static function migrate_from_2_0_0() { + wp_clear_scheduled_hook( 'activitypub_send_post_activity' ); + wp_clear_scheduled_hook( 'activitypub_send_update_activity' ); + wp_clear_scheduled_hook( 'activitypub_send_delete_activity' ); + + wp_unschedule_hook( 'activitypub_send_post_activity' ); + wp_unschedule_hook( 'activitypub_send_update_activity' ); + wp_unschedule_hook( 'activitypub_send_delete_activity' ); + + $object_type = \get_option( 'activitypub_object_type', ACTIVITYPUB_DEFAULT_OBJECT_TYPE ); + if ( 'article' === $object_type ) { + \update_option( 'activitypub_object_type', 'wordpress-post-format' ); + } + } + + /** + * Add the ActivityPub capability to all users that can publish posts + * Delete old meta to store followers. + */ + private static function migrate_from_2_2_0() { + // Add the ActivityPub capability to all users that can publish posts. + self::add_activitypub_capability(); + } + + /** + * Rename DB fields. + */ + private static function migrate_from_2_6_0() { + wp_cache_flush(); + + self::update_usermeta_key( 'activitypub_user_description', 'activitypub_description' ); + + self::update_options_key( 'activitypub_blog_user_description', 'activitypub_blog_description' ); + self::update_options_key( 'activitypub_blog_user_identifier', 'activitypub_blog_identifier' ); + } + + /** + * * Update actor-mode settings. + * * Get the ID of the latest blog post and save it to the options table. + */ + private static function migrate_to_4_0_0() { + $latest_post_id = 0; + + // Get the ID of the latest blog post and save it to the options table. + $latest_post = get_posts( + array( + 'numberposts' => 1, + 'orderby' => 'ID', + 'order' => 'DESC', + 'post_type' => 'any', + 'post_status' => 'publish', + ) + ); + + if ( $latest_post ) { + $latest_post_id = $latest_post[0]->ID; + } + + \update_option( 'activitypub_last_post_with_permalink_as_id', $latest_post_id ); + + $users = \get_users( + array( + 'capability__in' => array( 'activitypub' ), + ) + ); + + foreach ( $users as $user ) { + $followers = Followers::get_many( $user->ID ); + + if ( $followers ) { + \update_user_option( $user->ID, 'activitypub_use_permalink_as_id', '1' ); + } + } + + $followers = Followers::get_many( Actors::BLOG_USER_ID ); + + if ( $followers ) { + \update_option( 'activitypub_use_permalink_as_id_for_blog', '1' ); + } + + self::migrate_actor_mode(); + } + + /** + * Update to 4.1.0 + * + * * Migrate the `activitypub_post_content_type` to only use `activitypub_custom_post_content`. + */ + public static function migrate_to_4_1_0() { + $content_type = \get_option( 'activitypub_post_content_type' ); + + switch ( $content_type ) { + case 'excerpt': + $template = "[ap_excerpt]\n\n[ap_permalink type=\"html\"]"; + break; + case 'title': + $template = "[ap_title type=\"html\"]\n\n[ap_permalink type=\"html\"]"; + break; + case 'content': + $template = "[ap_content]\n\n[ap_permalink type=\"html\"]\n\n[ap_hashtags]"; + break; + case 'custom': + $template = \get_option( 'activitypub_custom_post_content', ACTIVITYPUB_CUSTOM_POST_CONTENT ); + break; + default: + $template = ACTIVITYPUB_CUSTOM_POST_CONTENT; + break; + } + + \update_option( 'activitypub_custom_post_content', $template ); + + \delete_option( 'activitypub_post_content_type' ); + + $object_type = \get_option( 'activitypub_object_type', false ); + if ( ! $object_type ) { + \update_option( 'activitypub_object_type', 'note' ); + } + + // Clean up empty visibility meta. + global $wpdb; + $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + "DELETE FROM $wpdb->postmeta + WHERE meta_key = 'activitypub_content_visibility' + AND (meta_value IS NULL OR meta_value = '')" + ); + } + + /** + * Updates post meta keys to be prefixed with an underscore. + */ + public static function migrate_to_4_7_1() { + global $wpdb; + + $meta_keys = array( + 'activitypub_actor_json', + 'activitypub_canonical_url', + 'activitypub_errors', + 'activitypub_inbox', + 'activitypub_user_id', + ); + + foreach ( $meta_keys as $meta_key ) { + // phpcs:ignore WordPress.DB + $wpdb->update( $wpdb->postmeta, array( 'meta_key' => '_' . $meta_key ), array( 'meta_key' => $meta_key ) ); + } + } + + /** + * Clears the post cache for Followers, we should have done this in 4.7.1 when we renamed those keys. + */ + public static function migrate_to_4_7_2() { + global $wpdb; + // phpcs:ignore WordPress.DB + $followers = $wpdb->get_col( + $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s", Remote_Actors::POST_TYPE ) + ); + foreach ( $followers as $id ) { + clean_post_cache( $id ); + } + } + + /** + * Update comment counts for posts in batches. + * + * @see Comment::pre_wp_update_comment_count_now() + * @param int $batch_size Optional. Number of posts to process per batch. Default 100. + * @param int $offset Optional. Number of posts to skip. Default 0. + * + * @return int[]|void Array with batch size and offset if there are more posts to process. + */ + public static function update_comment_counts( $batch_size = 100, $offset = 0 ) { + global $wpdb; + + Comment::register_comment_types(); + $comment_types = Comment::get_comment_type_slugs(); + $type_inclusion = "AND comment_type IN ('" . implode( "','", $comment_types ) . "')"; + + // Get and process this batch. + $post_ids = $wpdb->get_col( // phpcs:ignore WordPress.DB + $wpdb->prepare( + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + "SELECT DISTINCT comment_post_ID FROM {$wpdb->comments} WHERE comment_approved = '1' {$type_inclusion} ORDER BY comment_post_ID LIMIT %d OFFSET %d", + $batch_size, + $offset + ) + ); + + foreach ( $post_ids as $post_id ) { + \wp_update_comment_count_now( $post_id ); + } + + if ( count( $post_ids ) === $batch_size ) { + // Schedule next batch. + return array( $batch_size, $offset + $batch_size ); + } + } + + /** + * Create outbox items for posts in batches. + * + * @param int $batch_size Optional. Number of posts to process per batch. Default 50. + * @param int $offset Optional. Number of posts to skip. Default 0. + * @return array|null Array with batch size and offset if there are more posts to process, null otherwise. + */ + public static function create_post_outbox_items( $batch_size = 50, $offset = 0 ) { + $posts = \get_posts( + array( + // our own `ap_outbox` will be excluded from `any` by virtue of its `exclude_from_search` arg. + 'post_type' => 'any', + 'posts_per_page' => $batch_size, + 'offset' => $offset, + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + 'meta_query' => array( + array( + 'key' => 'activitypub_status', + 'value' => ACTIVITYPUB_OBJECT_STATE_FEDERATED, + ), + ), + ) + ); + + // Avoid multiple queries for post meta. + \update_postmeta_cache( \wp_list_pluck( $posts, 'ID' ) ); + + foreach ( $posts as $post ) { + $visibility = \get_post_meta( $post->ID, 'activitypub_content_visibility', true ); + + self::add_to_outbox( $post, 'Create', $post->post_author, $visibility ); + + // Add Update activity when the post has been modified. + if ( $post->post_modified !== $post->post_date ) { + self::add_to_outbox( $post, 'Update', $post->post_author, $visibility ); + } + } + + if ( count( $posts ) === $batch_size ) { + return array( + 'batch_size' => $batch_size, + 'offset' => $offset + $batch_size, + ); + } + + return null; + } + + /** + * Create outbox items for comments in batches. + * + * @param int $batch_size Optional. Number of posts to process per batch. Default 50. + * @param int $offset Optional. Number of posts to skip. Default 0. + * @return array|null Array with batch size and offset if there are more posts to process, null otherwise. + */ + public static function create_comment_outbox_items( $batch_size = 50, $offset = 0 ) { + $comments = \get_comments( + array( + 'author__not_in' => array( 0 ), // Limit to comments by registered users. + 'number' => $batch_size, + 'offset' => $offset, + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + 'meta_query' => array( + array( + 'key' => 'activitypub_status', + 'value' => ACTIVITYPUB_OBJECT_STATE_FEDERATED, + ), + ), + ) + ); + + foreach ( $comments as $comment ) { + self::add_to_outbox( $comment, 'Create', $comment->user_id ); + } + + if ( count( $comments ) === $batch_size ) { + return array( + 'batch_size' => $batch_size, + 'offset' => $offset + $batch_size, + ); + } + + return null; + } + + /** + * Update _activitypub_actor_json meta values to ensure they are properly slashed. + * + * @param int $batch_size Optional. Number of meta values to process per batch. Default 100. + * @param int $offset Optional. Number of meta values to skip. Default 0. + * @return array|null Array with batch size and offset if there are more meta values to process, null otherwise. + */ + public static function update_actor_json_slashing( $batch_size = 100, $offset = 0 ) { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $meta_values = $wpdb->get_results( + $wpdb->prepare( + "SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_activitypub_actor_json' LIMIT %d OFFSET %d", + $batch_size, + $offset + ) + ); + + foreach ( $meta_values as $meta ) { + $json = \json_decode( $meta->meta_value, true ); + + // If json_decode fails, try adding slashes. + if ( null === $json && \json_last_error() !== JSON_ERROR_NONE ) { + $escaped_value = \preg_replace( '#\\\\(?!["\\\\/bfnrtu])#', '\\\\\\\\', $meta->meta_value ); + $json = \json_decode( $escaped_value, true ); + + // Update the meta if json_decode succeeds with slashes. + if ( null !== $json && \json_last_error() === JSON_ERROR_NONE ) { + \update_post_meta( $meta->post_id, '_activitypub_actor_json', \wp_slash( $escaped_value ) ); + } + } + } + + if ( \count( $meta_values ) === $batch_size ) { + return array( + 'batch_size' => $batch_size, + 'offset' => $offset + $batch_size, + ); + } + + return null; + } + + /** + * Update comment author emails with webfinger addresses for ActivityPub comments. + * + * @param int $batch_size Optional. Number of comments to process per batch. Default 50. + * @param int $offset Optional. Number of comments to skip. Default 0. + * @return array|null Array with batch size and offset if there are more comments to process, null otherwise. + */ + public static function update_comment_author_emails( $batch_size = 50, $offset = 0 ) { + $comments = \get_comments( + array( + 'number' => $batch_size, + 'offset' => $offset, + 'orderby' => 'comment_ID', + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + 'meta_query' => array( + array( + 'key' => 'protocol', + 'value' => 'activitypub', + ), + ), + ) + ); + + foreach ( $comments as $comment ) { + $comment_author_url = $comment->comment_author_url; + if ( empty( $comment_author_url ) ) { + continue; + } + + $webfinger = Webfinger::uri_to_acct( $comment_author_url ); + if ( \is_wp_error( $webfinger ) ) { + continue; + } + + \wp_update_comment( + array( + 'comment_ID' => $comment->comment_ID, + 'comment_author_email' => \str_replace( 'acct:', '', $webfinger ), + ) + ); + } + + if ( count( $comments ) === $batch_size ) { + return array( + 'batch_size' => $batch_size, + 'offset' => $offset + $batch_size, + ); + } + + return null; + } + + /** + * Set the defaults needed for the plugin to work. + * + * Add the ActivityPub capability to all users that can publish posts. + */ + public static function add_default_settings() { + self::add_activitypub_capability(); + self::add_default_extra_field(); + } + + /** + * Add an activity to the outbox without federating it. + * + * @param \WP_Post|\WP_Comment $comment The comment or post object. + * @param string $activity_type The type of activity. + * @param int $user_id The user ID. + * @param string $visibility Optional. The visibility of the content. Default 'public'. + */ + private static function add_to_outbox( $comment, $activity_type, $user_id, $visibility = ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC ) { + $transformer = Factory::get_transformer( $comment ); + if ( ! $transformer || \is_wp_error( $transformer ) ) { + return; + } + + $activity = $transformer->to_activity( $activity_type ); + if ( ! $activity || \is_wp_error( $activity ) ) { + return; + } + + // If the user is disabled, fall back to the blog user when available. + if ( ! user_can_activitypub( $user_id ) ) { + if ( user_can_activitypub( Actors::BLOG_USER_ID ) ) { + $user_id = Actors::BLOG_USER_ID; + } else { + return; + } + } + + $post_id = Outbox::add( $activity, $user_id, $visibility ); + + // Immediately set to publish, no federation needed. + \wp_publish_post( $post_id ); + } + + /** + * Add the ActivityPub capability to all users that can publish posts. + */ + private static function add_activitypub_capability() { + // Get all WP_User objects that can publish posts. + $users = \get_users( + array( + 'capability__in' => array( 'publish_posts' ), + ) + ); + + // Add ActivityPub capability to all users that can publish posts. + foreach ( $users as $user ) { + $user->add_cap( 'activitypub' ); + } + } + + /** + * Add a default extra field for the user. + */ + private static function add_default_extra_field() { + $users = \get_users( + array( + 'capability__in' => array( 'activitypub' ), + ) + ); + + $title = \__( 'Powered by', 'activitypub' ); + $content = 'WordPress'; + + // Add a default extra field for each user. + foreach ( $users as $user ) { + \wp_insert_post( + array( + 'post_type' => Extra_Fields::USER_POST_TYPE, + 'post_author' => $user->ID, + 'post_status' => 'publish', + 'post_title' => $title, + 'post_content' => $content, + ) + ); + } + + \wp_insert_post( + array( + 'post_type' => Extra_Fields::BLOG_POST_TYPE, + 'post_author' => 0, + 'post_status' => 'publish', + 'post_title' => $title, + 'post_content' => $content, + ) + ); + } + + /** + * Rename user meta keys. + * + * @param string $old_key The old comment meta key. + * @param string $new_key The new comment meta key. + */ + private static function update_usermeta_key( $old_key, $new_key ) { + global $wpdb; + + $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->usermeta, + array( 'meta_key' => $new_key ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + array( 'meta_key' => $old_key ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + array( '%s' ), + array( '%s' ) + ); + } + + /** + * Update post meta keys. + * + * @param string $old_key The old post meta key. + * @param string $new_key The new post meta key. + */ + private static function update_postmeta_key( $old_key, $new_key ) { + global $wpdb; + + $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->postmeta, + array( 'meta_key' => $new_key ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + array( 'meta_key' => $old_key ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + array( '%s' ), + array( '%s' ) + ); + } + + /** + * Rename option keys. + * + * @param string $old_key The old option key. + * @param string $new_key The new option key. + */ + private static function update_options_key( $old_key, $new_key ) { + global $wpdb; + + $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->options, + array( 'option_name' => $new_key ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + array( 'option_name' => $old_key ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + array( '%s' ), + array( '%s' ) + ); + } + + /** + * Migrate the actor mode settings. + */ + public static function migrate_actor_mode() { + $blog_profile = \get_option( 'activitypub_enable_blog_user', '0' ); + $author_profiles = \get_option( 'activitypub_enable_users', '1' ); + + if ( + '1' === $blog_profile && + '1' === $author_profiles + ) { + \update_option( 'activitypub_actor_mode', ACTIVITYPUB_ACTOR_AND_BLOG_MODE ); + } elseif ( + '1' === $blog_profile && + '1' !== $author_profiles + ) { + \update_option( 'activitypub_actor_mode', ACTIVITYPUB_BLOG_MODE ); + } elseif ( + '1' !== $blog_profile && + '1' === $author_profiles + ) { + \update_option( 'activitypub_actor_mode', ACTIVITYPUB_ACTOR_MODE ); + } + } + + /** + * Deletes user extra fields where the author is the blog user. + * + * These extra fields were created when the Enable Mastodon Apps integration passed + * an author_url instead of a user_id to the mastodon_api_account filter. This caused + * Extra_Fields::default_actor_extra_fields() to run but fail to cache the fact it ran + * for non-existent users. The result is a number of user extra fields with no author. + * + * @ticket https://github.com/Automattic/wordpress-activitypub/pull/1554 + */ + public static function delete_mastodon_api_orphaned_extra_fields() { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->delete( + $wpdb->posts, + array( + 'post_type' => Extra_Fields::USER_POST_TYPE, + 'post_author' => Actors::BLOG_USER_ID, + ) + ); + } + + /** + * Update notification options. + */ + public static function update_notification_options() { + $new_dm = \get_option( 'activitypub_mailer_new_dm', '1' ); + $new_follower = \get_option( 'activitypub_mailer_new_follower', '1' ); + + // Add the blog user notification options. + \add_option( 'activitypub_blog_user_mailer_new_dm', $new_dm ); + \add_option( 'activitypub_blog_user_mailer_new_follower', $new_follower ); + \add_option( 'activitypub_blog_user_mailer_new_mention', '1' ); + + $user_ids = \get_users( + array( + 'capability__in' => array( 'activitypub' ), + 'fields' => 'id', + ) + ); + + // Add the actor notification options. + foreach ( $user_ids as $user_id ) { + \update_user_option( $user_id, 'activitypub_mailer_new_dm', $new_dm ); + \update_user_option( $user_id, 'activitypub_mailer_new_follower', $new_follower ); + \update_user_option( $user_id, 'activitypub_mailer_new_mention', '1' ); + } + + // Delete the old notification options. + \delete_option( 'activitypub_mailer_new_dm' ); + \delete_option( 'activitypub_mailer_new_follower' ); + } + + /** + * Migrate followers to the new CPT. + */ + public static function migrate_followers_to_ap_actor_cpt() { + global $wpdb; + + $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->posts, + array( 'post_type' => Remote_Actors::POST_TYPE ), + array( 'post_type' => 'ap_follower' ), + array( '%s' ), + array( '%s' ) + ); + + self::update_postmeta_key( '_activitypub_user_id', Followers::FOLLOWER_META_KEY ); + } + + /** + * Update _activitypub_actor_json meta values to ensure they are properly slashed. + * + * @param int $batch_size Optional. Number of meta values to process per batch. Default 100. + * + * @return array|void Array with batch size and offset if there are more meta values to process, void otherwise. + */ + public static function update_actor_json_storage( $batch_size = 100 ) { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $meta_values = $wpdb->get_results( + $wpdb->prepare( + "SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_activitypub_actor_json' LIMIT %d", + $batch_size + ) + ); + + $has_kses = false !== \has_filter( 'content_save_pre', 'wp_filter_post_kses' ); + if ( $has_kses ) { + // Prevent KSES from corrupting JSON in post_content. + \kses_remove_filters(); + } + + foreach ( $meta_values as $meta ) { + $post = \get_post( $meta->post_id ); + + if ( ! $post ) { + \delete_post_meta( $meta->post_id, '_activitypub_actor_json' ); + continue; + } + + $post_content = \json_decode( $meta->meta_value, true ); + + if ( \json_last_error() !== JSON_ERROR_NONE ) { + $post_content = Http::get_remote_object( $post->guid ); + + if ( \is_wp_error( $post_content ) ) { + \delete_post_meta( $post->ID, '_activitypub_actor_json' ); + continue; + } + } + + \wp_update_post( + array( + 'ID' => $post->ID, + 'post_content' => \wp_slash( \wp_json_encode( $post_content ) ), + ) + ); + + \delete_post_meta( $post->ID, '_activitypub_actor_json' ); + } + + if ( $has_kses ) { + // Restore KSES filters. + \kses_init_filters(); + } + + if ( \count( $meta_values ) === $batch_size ) { + return array( + 'batch_size' => $batch_size, + ); + } + } + + /** + * Removes pending follow requests for the application user. + */ + public static function remove_pending_application_user_follow_requests() { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->delete( + $wpdb->postmeta, + array( + 'meta_key' => '_activitypub_following', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + 'meta_value' => Actors::APPLICATION_USER_ID, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value + ) + ); + } + + /** + * Sync Jetpack meta for all followings. + * + * Replays the added_post_meta sync action for Jetpack with the Following::FOLLOWING_META_KEY meta key. + */ + public static function sync_jetpack_following_meta() { + if ( ! \class_exists( 'Jetpack' ) || ! \Jetpack::is_connection_ready() ) { + return; + } + + global $wpdb; + + // Get all posts that have the following meta key. + $posts_with_following = $wpdb->get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->prepare( + "SELECT meta_id, post_id, meta_key, meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s", + Following::FOLLOWING_META_KEY + ), + ARRAY_N + ); + + // Trigger the added_post_meta action for each following relationship. + foreach ( $posts_with_following as $meta ) { + /** + * Fires when post meta is added. + * + * @param int $meta_id ID of the metadata entry. + * @param int $object_id Post ID. + * @param string $meta_key Metadata key. + * @param mixed $meta_value Metadata value. + */ + \do_action( 'added_post_meta', ...$meta ); + } + } + + /** + * Clean up inbox items for shared inbox migration. + * + * Deletes all existing inbox items to prepare for the new shared inbox structure + * where activities are stored once with multiple recipients as metadata. + */ + private static function clean_up_inbox() { + global $wpdb; + + // Get all inbox post IDs. + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $inbox_ids = $wpdb->get_col( + $wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s", + \Activitypub\Collection\Inbox::POST_TYPE + ) + ); + + // Delete all inbox items and their metadata. + foreach ( $inbox_ids as $post_id ) { + \wp_delete_post( $post_id, true ); + } + } + + /** + * Migrate URLs from the legacy `activitypub_tombstone_urls` option into the + * `ap_tombstone` custom post type. + * + * Chunked async migration. Locking and rescheduling is handled by + * Scheduler::async_batch — the callback returns `array( 'batch_size' => N )` + * to request another run, or `null` when the option is fully drained. + * + * Legacy entries are already-normalized strings (no scheme), so we bypass + * URL validation and insert directly via wp_insert_post. + * + * @since 8.3.0 + * + * @param int $batch_size Optional. Number of URLs to process per call. Default 500. + * @return array|null Args for the next run, or null when migration is complete. + */ + public static function migrate_tombstones_to_cpt( $batch_size = 500 ) { + global $wpdb; + + $urls = \get_option( 'activitypub_tombstone_urls', null ); + + if ( null === $urls || ! \is_array( $urls ) || empty( $urls ) ) { + \delete_option( 'activitypub_tombstone_urls' ); + return null; + } + + $chunk = \array_slice( $urls, 0, (int) $batch_size ); + $remaining = \array_slice( $urls, (int) $batch_size ); + $progressed = false; + + foreach ( $chunk as $normalized ) { + if ( ! \is_string( $normalized ) || '' === $normalized ) { + // Drop garbage entries — counts as progress. + $progressed = true; + continue; + } + + $hash = \md5( $normalized ); + + /* + * Light existence check. `get_page_by_path()` would hydrate a + * full `WP_Post` per loop iteration; on a large registry that + * adds up fast. We only need a boolean here. + */ + $exists = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->prepare( + "SELECT 1 FROM {$wpdb->posts} WHERE post_type = %s AND post_name = %s LIMIT 1", + Tombstone::POST_TYPE, + $hash + ) + ); + if ( $exists ) { + $progressed = true; + continue; + } + + /* + * `guid` is intentionally omitted: the legacy option only kept + * the normalized (schemeless) form, so we can't reconstruct the + * original URL. Storing the schemeless string would be mangled + * by `esc_url()`. Leave WordPress to auto-generate the guid + * — it's not used for lookups, only for debugging. + */ + $result = \wp_insert_post( + array( + 'post_type' => Tombstone::POST_TYPE, + 'post_status' => 'publish', + 'post_name' => $hash, + 'post_author' => 0, + ), + true + ); + + if ( \is_wp_error( $result ) || ! $result ) { + /* + * Keep failed inserts in the legacy option so the next batch + * retries them. `Tombstone::exists_local()` still falls back + * to the option, so the tombstone remains discoverable. + */ + $remaining[] = $normalized; + } else { + $progressed = true; + } + } + + if ( empty( $remaining ) ) { + \delete_option( 'activitypub_tombstone_urls' ); + return null; + } + + /* + * Disable autoload while we drain. The point of the migration is to + * stop this option from contributing to `alloptions` pressure, so + * flip the flag immediately rather than waiting for the option to + * be fully empty before the relief kicks in. + */ + \update_option( 'activitypub_tombstone_urls', \array_values( $remaining ), false ); + + /* + * If nothing in this batch was drained — every insert errored and + * nothing was already migrated — halt the scheduler so we don't loop + * forever on a persistent failure. The legacy option still backs + * exists_local(), so the data isn't lost; an admin can re-trigger + * the migration via `wp cron event run activitypub_tombstone_migrate` + * after fixing the underlying cause. + */ + if ( ! $progressed ) { + return null; + } + + return array( 'batch_size' => (int) $batch_size ); + } + + /** + * Migrate avatar URLs from comment meta to remote actors in batches. + * + * This migration: + * 1. Finds all comments with ActivityPub protocol and avatar_url meta + * 2. Looks up the remote actor by comment_author_url + * 3. Adds _activitypub_remote_actor_id to comment meta + * 4. Stores avatar_url in remote actor post meta + * + * Note: We don't use offset because as we add _activitypub_remote_actor_id, + * comments are filtered out of the query. We just keep fetching the next + * batch until no more comments match the criteria. + * + * @param int $batch_size Optional. Number of comments to process per batch. Default 50. + * @return array|null Array with batch size if there are more comments to process, null otherwise. + */ + public static function migrate_avatar_to_remote_actors( $batch_size = 50 ) { + global $wpdb; + + /* + * Get comments with avatar_url meta that don't have _activitypub_remote_actor_id yet. + * Uses conditional aggregation to reduce JOINs from 3 to 1, improving query performance. + * Filters meta_key before GROUP BY to reduce rows processed during aggregation. + * No offset needed - as we process comments, they're filtered out by the HAVING clause. + */ + $comments = $wpdb->get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->prepare( + "SELECT c.comment_ID, c.comment_author_url, + MAX(CASE WHEN cm.meta_key = 'avatar_url' THEN cm.meta_value END) AS avatar_url, + MAX(CASE WHEN cm.meta_key = 'protocol' THEN cm.meta_value END) AS protocol, + MAX(CASE WHEN cm.meta_key = '_activitypub_remote_actor_id' THEN cm.meta_value END) AS remote_actor_id + FROM {$wpdb->comments} c + INNER JOIN {$wpdb->commentmeta} cm ON c.comment_ID = cm.comment_id + WHERE cm.meta_key IN ('avatar_url', 'protocol', '_activitypub_remote_actor_id') + GROUP BY c.comment_ID, c.comment_author_url + HAVING protocol = 'activitypub' + AND avatar_url IS NOT NULL + AND (remote_actor_id IS NULL OR remote_actor_id = '') + LIMIT %d", + $batch_size + ) + ); + + foreach ( $comments as $comment ) { + if ( empty( $comment->comment_author_url ) ) { + continue; + } + + // Try to get the remote actor by URI. + $remote_actor = Remote_Actors::fetch_by_uri( $comment->comment_author_url ); + + // If we have a valid remote actor, store the reference. + if ( ! \is_wp_error( $remote_actor ) ) { + // Add _activitypub_remote_actor_id to comment meta. + \add_comment_meta( $comment->comment_ID, '_activitypub_remote_actor_id', $remote_actor->ID, true ); + + // Ensure avatar is stored on remote actor if not already present. + $existing_avatar = \get_post_meta( $remote_actor->ID, '_activitypub_avatar_url', true ); + if ( empty( $existing_avatar ) && ! empty( $comment->avatar_url ) ) { + \update_post_meta( $remote_actor->ID, '_activitypub_avatar_url', \esc_url_raw( $comment->avatar_url ) ); + } + } + } + + // Return batch info if there are more comments to process. + if ( count( $comments ) === $batch_size ) { + return array( + 'batch_size' => $batch_size, + ); + } + + return null; + } + + /** + * Migrate emoji data from stored actor JSON to post meta. + * + * This migration: + * 1. Finds all remote actor posts without _activitypub_emoji meta + * 2. Extracts emoji from stored JSON in post_content + * 3. Stores as _activitypub_emoji post meta + * + * @param int $batch_size Optional. Number of actors to process per batch. Default 50. + * @param int $offset Optional. Offset for pagination. Default 0. + * @return array|null Array with batch size if there are more actors to process, null otherwise. + */ + public static function migrate_actor_emoji( $batch_size = 50, $offset = 0 ) { + $actors = \get_posts( + array( + 'post_type' => Remote_Actors::POST_TYPE, + 'posts_per_page' => $batch_size, + 'offset' => $offset, + 'post_status' => 'any', + 'orderby' => 'ID', + 'order' => 'ASC', + ) + ); + + foreach ( $actors as $actor_post ) { + if ( empty( $actor_post->post_content ) ) { + continue; + } + + $actor_data = \json_decode( $actor_post->post_content, true ); + if ( ! $actor_data ) { + continue; + } + + $emoji_meta = Emoji::prepare_actor_meta( $actor_data ); + if ( ! empty( $emoji_meta['_activitypub_emoji'] ) ) { + \update_post_meta( $actor_post->ID, '_activitypub_emoji', $emoji_meta['_activitypub_emoji'] ); + } + } + + // Return batch info if there are more actors to process. + if ( count( $actors ) === $batch_size ) { + return array( + 'batch_size' => $batch_size, + 'offset' => $offset + $batch_size, + ); + } + + return null; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-moderation.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-moderation.php new file mode 100644 index 00000000..b28164b0 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-moderation.php @@ -0,0 +1,426 @@ + 'activitypub_blocked_domains', + self::TYPE_KEYWORD => 'activitypub_blocked_keywords', + ); + + /** + * Option key for site-wide blocked keywords. + */ + const OPTION_KEYS = array( + self::TYPE_DOMAIN => 'activitypub_site_blocked_domains', + self::TYPE_KEYWORD => 'activitypub_site_blocked_keywords', + ); + + /** + * Check if an activity should be blocked for a specific user. + * + * @param Activity $activity The activity. + * @param int|null $user_id The user ID to check blocks for. + * @return bool True if blocked, false otherwise. + */ + public static function activity_is_blocked( $activity, $user_id = null ) { + if ( ! $activity instanceof Activity ) { + return false; + } + + // First check site-wide blocks (admin moderation). + if ( self::activity_is_blocked_site_wide( $activity ) ) { + return true; + } + + // Then check user-specific blocks. + if ( $user_id && self::activity_is_blocked_for_user( $activity, $user_id ) ) { + return true; + } + + $remote_addr = \sanitize_text_field( \wp_unslash( $_SERVER['REMOTE_ADDR'] ?? '' ) ); + $user_agent = \sanitize_text_field( \wp_unslash( $_SERVER['HTTP_USER_AGENT'] ?? '' ) ); + + // Fall back to WordPress comment disallowed list. + return \wp_check_comment_disallowed_list( $activity->to_json( false ), '', '', $activity->get_content(), $remote_addr, $user_agent ); + } + + /** + * Check if an activity is blocked site-wide. + * + * @param Activity $activity The activity. + * @return bool True if blocked, false otherwise. + */ + public static function activity_is_blocked_site_wide( $activity ) { + $blocks = self::get_site_blocks(); + + return self::check_activity_against_blocks( $activity, $blocks['actors'], $blocks['domains'], $blocks['keywords'] ); + } + + /** + * Check if an activity is blocked for a specific user. + * + * @param Activity $activity The activity. + * @param int $user_id The user ID. + * @return bool True if blocked, false otherwise. + */ + public static function activity_is_blocked_for_user( $activity, $user_id ) { + $blocks = self::get_user_blocks( $user_id ); + + return self::check_activity_against_blocks( $activity, $blocks['actors'], $blocks['domains'], $blocks['keywords'] ); + } + + /** + * Add a block for a user. + * + * @param int $user_id The user ID. + * @param string $type The block type (actor, domain, keyword). + * @param string $value The value to block. + * @return bool True on success, false on failure. + */ + public static function add_user_block( $user_id, $type, $value ) { + switch ( $type ) { + case self::TYPE_ACTOR: + return Blocked_Actors::add( $user_id, $value ); + + case self::TYPE_DOMAIN: + case self::TYPE_KEYWORD: + $blocks = \get_user_meta( $user_id, self::USER_META_KEYS[ $type ], true ) ?: array(); + + if ( ! \in_array( $value, $blocks, true ) ) { + /** + * Fired when a domain or keyword is blocked. + * + * @param string $value The blocked domain or keyword. + * @param string $type The block type (actor, domain, keyword). + * @param int $user_id The user ID. + */ + \do_action( 'activitypub_add_user_block', $value, $type, $user_id ); + + $blocks[] = $value; + return (bool) \update_user_meta( $user_id, self::USER_META_KEYS[ $type ], $blocks ); + } + break; + } + + return true; // Already blocked. + } + + /** + * Remove a block for a user. + * + * @param int $user_id The user ID. + * @param string $type The block type (actor, domain, keyword). + * @param string $value The value to unblock. + * @return bool True on success, false on failure. + */ + public static function remove_user_block( $user_id, $type, $value ) { + switch ( $type ) { + case self::TYPE_ACTOR: + return Blocked_Actors::remove( $user_id, $value ); + + case self::TYPE_DOMAIN: + case self::TYPE_KEYWORD: + $blocks = \get_user_meta( $user_id, self::USER_META_KEYS[ $type ], true ) ?: array(); + $key = \array_search( $value, $blocks, true ); + + if ( false !== $key ) { + /** + * Fired when a domain or keyword is unblocked. + * + * @param string $value The unblocked domain or keyword. + * @param string $type The block type (actor, domain, keyword). + * @param int $user_id The user ID. + */ + \do_action( 'activitypub_remove_user_block', $value, $type, $user_id ); + + unset( $blocks[ $key ] ); + return \update_user_meta( $user_id, self::USER_META_KEYS[ $type ], \array_values( $blocks ) ); + } + break; + } + + return true; // Not blocked anyway. + } + + /** + * Get all blocks for a user. + * + * @param int $user_id The user ID. + * @return array Array of blocks organized by type. + */ + public static function get_user_blocks( $user_id ) { + return array( + 'actors' => \wp_list_pluck( Blocked_Actors::get_many( $user_id ), 'guid' ), + 'domains' => \get_user_meta( $user_id, self::USER_META_KEYS[ self::TYPE_DOMAIN ], true ) ?: array(), + 'keywords' => \get_user_meta( $user_id, self::USER_META_KEYS[ self::TYPE_KEYWORD ], true ) ?: array(), + ); + } + + /** + * Add a site-wide block. + * + * @param string $type The block type (actor, domain, keyword). + * @param string $value The value to block. + * @return bool True on success, false on failure. + */ + public static function add_site_block( $type, $value ) { + switch ( $type ) { + case self::TYPE_ACTOR: + // Site-wide actor blocking uses the BLOG_USER_ID. + return self::add_user_block( Actors::BLOG_USER_ID, self::TYPE_ACTOR, $value ); + + case self::TYPE_DOMAIN: + case self::TYPE_KEYWORD: + $blocks = \get_option( self::OPTION_KEYS[ $type ], array() ); + + if ( ! \in_array( $value, $blocks, true ) ) { + /** + * Fired when a domain or keyword is blocked site-wide. + * + * @param string $value The blocked domain or keyword. + * @param string $type The block type (actor, domain, keyword). + */ + \do_action( 'activitypub_add_site_block', $value, $type ); + + $blocks[] = $value; + return \update_option( self::OPTION_KEYS[ $type ], $blocks ); + } + break; + } + + return true; // Already blocked. + } + + /** + * Add multiple site-wide blocks at once. + * + * More efficient than calling add_site_block() in a loop as it + * performs a single database update. + * + * @param string $type The block type (domain or keyword only). + * @param array $values Array of values to block. + */ + public static function add_site_blocks( $type, $values ) { + if ( ! in_array( $type, array( self::TYPE_DOMAIN, self::TYPE_KEYWORD ), true ) ) { + return; + } + + if ( empty( $values ) ) { + return; + } + + foreach ( $values as $value ) { + /** + * Fired when a domain or keyword is blocked site-wide. + * + * @param string $value The blocked domain or keyword. + * @param string $type The block type (actor, domain, keyword). + */ + \do_action( 'activitypub_add_site_block', $value, $type ); + } + + $existing = \get_option( self::OPTION_KEYS[ $type ], array() ); + \update_option( self::OPTION_KEYS[ $type ], array_unique( array_merge( $existing, $values ) ) ); + } + + /** + * Remove a site-wide block. + * + * @param string $type The block type (actor, domain, keyword). + * @param string $value The value to unblock. + * @return bool True on success, false on failure. + */ + public static function remove_site_block( $type, $value ) { + switch ( $type ) { + case self::TYPE_ACTOR: + // Site-wide actor unblocking uses the BLOG_USER_ID. + return self::remove_user_block( Actors::BLOG_USER_ID, self::TYPE_ACTOR, $value ); + + case self::TYPE_DOMAIN: + case self::TYPE_KEYWORD: + $blocks = \get_option( self::OPTION_KEYS[ $type ], array() ); + $key = \array_search( $value, $blocks, true ); + + if ( false !== $key ) { + /** + * Fired when a domain or keyword is unblocked site-wide. + * + * @param string $value The unblocked domain or keyword. + * @param string $type The block type (actor, domain, keyword). + */ + \do_action( 'activitypub_remove_site_block', $value, $type ); + + unset( $blocks[ $key ] ); + return \update_option( self::OPTION_KEYS[ $type ], \array_values( $blocks ) ); + } + break; + } + + return true; // Not blocked anyway. + } + + /** + * Get all site-wide blocks. + * + * @return array Array of blocks organized by type. + */ + public static function get_site_blocks() { + return array( + 'actors' => \wp_list_pluck( Blocked_Actors::get_many( Actors::BLOG_USER_ID ), 'guid' ), + 'domains' => \get_option( self::OPTION_KEYS[ self::TYPE_DOMAIN ], array() ), + 'keywords' => \get_option( self::OPTION_KEYS[ self::TYPE_KEYWORD ], array() ), + ); + } + + /** + * Check if an actor is blocked by user or site-wide. + * + * @param string $actor_uri Actor URI to check. + * @param int $user_id Optional. User ID to check user blocks for. Defaults to 0 (site-wide only). + * @return bool True if blocked, false otherwise. + */ + public static function is_actor_blocked( $actor_uri, $user_id = 0 ) { + if ( ! $actor_uri ) { + return false; + } + + // Check site-wide blocks. + $site_blocks = self::get_site_blocks(); + if ( \in_array( $actor_uri, $site_blocks['actors'], true ) ) { + return true; + } + + // Check site-wide domain blocks. + $actor_domain = \wp_parse_url( $actor_uri, PHP_URL_HOST ); + if ( $actor_domain && \in_array( $actor_domain, $site_blocks['domains'], true ) ) { + return true; + } + + // Check user-specific blocks if user_id is provided. + if ( $user_id > 0 ) { + $user_blocks = self::get_user_blocks( $user_id ); + if ( \in_array( $actor_uri, $user_blocks['actors'], true ) ) { + return true; + } + + // Check user-specific domain blocks. + if ( $actor_domain && \in_array( $actor_domain, $user_blocks['domains'], true ) ) { + return true; + } + } + + return false; + } + + /** + * Check activity against blocklists. + * + * @param Activity $activity The activity. + * @param array $blocked_actors List of blocked actors. + * @param array $blocked_domains List of blocked domains. + * @param array $blocked_keywords List of blocked keywords. + * @return bool True if blocked, false otherwise. + */ + private static function check_activity_against_blocks( $activity, $blocked_actors, $blocked_domains, $blocked_keywords ) { + $has_object = \is_object( $activity->get_object() ); + + // Extract actor information. + $actor_id = object_to_uri( $activity->get_actor() ); + + // Check blocked actors. + if ( $actor_id ) { + // If actor_id is not a URL, resolve it via webfinger. + if ( ! \str_starts_with( $actor_id, 'http' ) ) { + $resolved_url = Webfinger::resolve( $actor_id ); + if ( ! \is_wp_error( $resolved_url ) ) { + $actor_id = $resolved_url; + } + } + + if ( \in_array( $actor_id, $blocked_actors, true ) ) { + return true; + } + } + + // Check blocked domains. + $urls = array( + \wp_parse_url( $actor_id, PHP_URL_HOST ), + \wp_parse_url( $activity->get_id(), PHP_URL_HOST ), + \wp_parse_url( object_to_uri( $activity->get_object() ) ?? '', PHP_URL_HOST ), + ); + foreach ( $blocked_domains as $domain ) { + if ( \in_array( $domain, $urls, true ) ) { + return true; + } + } + + // Check blocked keywords in activity content. + if ( $has_object ) { + $object = $activity->get_object(); + $content_map = array(); + $content_map[] = $object->get_content(); + $content_map[] = $object->get_summary(); + $content_map[] = $object->get_name(); + + if ( is_actor( $object ) ) { + /* @var Actor $object Actor object */ + $content_map[] = $object->get_preferred_username(); + } + + if ( \is_array( $object->get_content_map() ) ) { + $content_map = \array_merge( $content_map, \array_values( $object->get_content_map() ) ); + } + + if ( \is_array( $object->get_summary_map() ) ) { + $content_map = \array_merge( $content_map, \array_values( $object->get_summary_map() ) ); + } + + if ( \is_array( $object->get_name_map() ) ) { + $content_map = \array_merge( $content_map, \array_values( $object->get_name_map() ) ); + } + + $content_map = \array_filter( $content_map ); + $content = \implode( ' ', $content_map ); + + foreach ( $blocked_keywords as $keyword ) { + if ( \stripos( $content, $keyword ) !== false ) { + return true; + } + } + } + + return false; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-move.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-move.php new file mode 100644 index 00000000..4f553442 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-move.php @@ -0,0 +1,319 @@ +get__id() > 0 ) { + \update_user_option( $user->get__id(), 'activitypub_moved_to', $to ); + } else { + \update_option( 'activitypub_blog_user_moved_to', $to ); + } + + $response = Http::get_remote_object( $to ); + + if ( \is_wp_error( $response ) ) { + return $response; + } + + $target_actor = new Actor(); + $target_actor->from_array( $response ); + + // Check if the `Move` Activity is valid. + $also_known_as = $target_actor->get_also_known_as() ?? array(); + if ( ! in_array( $from, $also_known_as, true ) ) { + return new \WP_Error( 'invalid_target', __( 'Invalid target', 'activitypub' ) ); + } + + $activity = new Activity(); + $activity->set_type( 'Move' ); + $activity->set_actor( $user->get_id() ); + $activity->set_origin( $user->get_id() ); + $activity->set_object( $user->get_id() ); + $activity->set_target( $target_actor->get_id() ); + + // Add to outbox. + return add_to_outbox( $activity, null, $user->get__id(), ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC ); + } + + /** + * Internal Move. + * + * Move an ActivityPub Actor from one location (internal) to another (internal). + * + * This helps with migrating abandoned profiles to `Move` to other profiles: + * + * `Move::internally( 'https://example.com/?author=123', 'https://example.com/?author=321' );` + * + * ... or to change Actor-IDs like: + * + * `Move::internally( 'https://example.com/author/foo', 'https://example.com/?author=123' );` + * + * @param string $from The current account URL. + * @param string $to The new account URL. + * + * @return int|bool|\WP_Error The ID of the outbox item or false or WP_Error on failure. + */ + public static function internally( $from, $to ) { + $user = Actors::get_by_various( $from ); + + if ( \is_wp_error( $user ) ) { + return $user; + } + + // Add the old account URL to alsoKnownAs. + if ( $user->get__id() > 0 ) { + self::update_user_also_known_as( $user->get__id(), $from ); + \update_user_option( $user->get__id(), 'activitypub_moved_to', $to ); + } else { + self::update_blog_also_known_as( $from ); + \update_option( 'activitypub_blog_user_moved_to', $to ); + } + + // check if `$from` is a URL or an ID. + if ( \filter_var( $from, FILTER_VALIDATE_URL ) ) { + $actor = $from; + } else { + $actor = $user->get_id(); + } + + $activity = new Activity(); + $activity->set_type( 'Move' ); + $activity->set_actor( $actor ); + $activity->set_origin( $actor ); + $activity->set_object( $actor ); + $activity->set_target( $to ); + + return add_to_outbox( $activity, null, $user->get__id(), ACTIVITYPUB_CONTENT_VISIBILITY_QUIET_PUBLIC ); + } + + /** + * Update the alsoKnownAs property of a user. + * + * @param int $user_id The user ID. + * @param string $from The current account URL. + */ + private static function update_user_also_known_as( $user_id, $from ) { + $also_known_as = \get_user_option( 'activitypub_also_known_as', $user_id ) ?: array(); + $also_known_as[] = $from; + + \update_user_option( $user_id, 'activitypub_also_known_as', $also_known_as ); + } + + /** + * Update the alsoKnownAs property of the blog. + * + * @param string $from The current account URL. + */ + private static function update_blog_also_known_as( $from ) { + $also_known_as = \get_option( 'activitypub_blog_user_also_known_as', array() ); + $also_known_as[] = $from; + + \update_option( 'activitypub_blog_user_also_known_as', $also_known_as ); + } + + /** + * Change domain for all ActivityPub Actors. + * + * This method handles domain migration according to the ActivityPub Data Portability spec. + * It stores the old host and calls Move::internally for each available profile. + * It also caches the JSON representation of the old Actor for future lookups. + * + * @param string $from The old domain. + * @param string $to The new domain. + * + * @return array Array of results from Move::internally calls. + */ + public static function change_domain( $from, $to ) { + // Get all actors that need to be migrated. + $actors = Actors::get_all(); + + $results = array(); + $to_host = \wp_parse_url( $to, \PHP_URL_HOST ); + $from_host = \wp_parse_url( $from, \PHP_URL_HOST ); + + // Store the old host for future reference. + \update_option( 'activitypub_old_host', $from_host ); + + // Process each actor. + foreach ( $actors as $actor ) { + $actor_id = $actor->get_id(); + + // Replace the new host with the old host in the actor ID. + $old_actor_id = str_replace( $to_host, $from_host, $actor_id ); + + // Call Move::internally for this actor. + $result = self::internally( $old_actor_id, $actor_id ); + + if ( \is_wp_error( $result ) ) { + /** + * Fires when an actor move fails during domain change. + * + * @since 8.1.0 + * + * @param \WP_Error $result The error that occurred. + * @param string $actor_id The actor ID that failed to move. + */ + \do_action( 'activitypub_move_failed', $result, $actor_id ); + continue; + } + + $json = str_replace( $to_host, $from_host, $actor->to_json() ); + + // Save the current actor data after migration. + if ( $actor instanceof Blog ) { + \update_option( 'activitypub_blog_user_old_host_data', $json, false ); + } else { + \update_user_option( $actor->get__id(), 'activitypub_old_host_data', $json ); + } + + $results[] = array( + 'actor' => $actor_id, + 'result' => $result, + ); + } + + return $results; + } + + /** + * Maybe initiate old user. + * + * This method checks if the current request domain matches the old host. + * If it does, it retrieves the cached data for the user and populates the instance. + * + * @param Blog|User $instance The Blog or User instance to populate. + */ + public static function maybe_initiate_old_user( $instance ) { + if ( ! Query::get_instance()->is_old_host_request() ) { + return; + } + + if ( $instance instanceof Blog ) { + $cached_data = \get_option( 'activitypub_blog_user_old_host_data' ); + } elseif ( $instance instanceof User ) { + $cached_data = \get_user_option( 'activitypub_old_host_data', $instance->get__id() ); + } + + if ( ! empty( $cached_data ) ) { + $instance->from_json( $cached_data ); + } + } + + /** + * Pre-send to inboxes. + * + * @param string $json The ActivityPub Activity JSON. + */ + public static function pre_send_to_inboxes( $json ) { + $json = json_decode( $json, true ); + + if ( 'Move' !== $json['type'] ) { + return; + } + + if ( is_same_domain( $json['object'] ) ) { + return; + } + + Query::get_instance()->set_old_host_request(); + } + + /** + * Filter to return the old blog username. + * + * @param null $pre The pre-existing value. + * @param string $username The username to check. + * + * @return Blog|null The old blog instance or null. + */ + public static function old_blog_username( $pre, $username ) { + $old_host = \get_option( 'activitypub_old_host' ); + + // Special case for Blog Actor on old host. + if ( $old_host === $username && Query::get_instance()->is_old_host_request() ) { + // Return a new Blog instance which will load the cached data in its constructor. + $pre = new Blog(); + } + + return $pre; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-notification.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-notification.php new file mode 100644 index 00000000..9b22d4bc --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-notification.php @@ -0,0 +1,85 @@ +type = $type; + $this->actor = $actor; + $this->object = $activity; + $this->target = $target; + } + + /** + * Send the notification. + */ + public function send() { + $type = \strtolower( $this->type ); + + /** + * Action to send ActivityPub notifications. + * + * @deprecated 7.5.0 Use "activitypub_handled_{$type}" instead. + * + * @param Notification $instance The notification object. + */ + \do_action_deprecated( 'activitypub_notification', array( $this ), '7.5.0', "activitypub_handled_{$type}" ); + + /** + * Type-specific action to send ActivityPub notifications. + * + * @deprecated 7.5.0 Use "activitypub_handled_{$type}" instead. + * + * @param Notification $instance The notification object. + */ + \do_action_deprecated( "activitypub_notification_{$type}", array( $this ), '7.5.0', "activitypub_handled_{$type}" ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-options.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-options.php new file mode 100644 index 00000000..083dc60e --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-options.php @@ -0,0 +1,741 @@ + 'string', + 'description' => 'Use title and link, summary, full or custom content', + 'show_in_rest' => array( + 'schema' => array( + 'enum' => array( 'title', 'excerpt', 'content' ), + ), + ), + 'default' => 'content', + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_custom_post_content', + array( + 'type' => 'string', + 'description' => 'Define your own custom post template', + 'show_in_rest' => true, + 'default' => ACTIVITYPUB_CUSTOM_POST_CONTENT, + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_max_image_attachments', + array( + 'type' => 'integer', + 'description' => 'Number of images to attach to posts.', + 'default' => ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS, + 'sanitize_callback' => static function ( $value ) { + return \is_numeric( $value ) ? \absint( $value ) : ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS; + }, + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_use_hashtags', + array( + 'type' => 'boolean', + 'description' => 'Add hashtags in the content as native tags and replace the #tag with the tag-link', + 'default' => '0', + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_use_opengraph', + array( + 'type' => 'boolean', + 'description' => 'Automatically add "fediverse:creator" OpenGraph tags for Authors and the Blog-User.', + 'default' => '1', + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_support_post_types', + array( + 'type' => 'string', + 'description' => 'Enable ActivityPub support for post types', + 'show_in_rest' => true, + 'default' => array( 'post' ), + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_actor_mode', + array( + 'type' => 'string', + 'description' => 'Choose your preferred Actor-Mode.', + 'default' => ACTIVITYPUB_ACTOR_MODE, + 'show_in_rest' => array( + 'schema' => array( + 'type' => 'string', + 'enum' => array( + ACTIVITYPUB_ACTOR_MODE, + ACTIVITYPUB_BLOG_MODE, + ACTIVITYPUB_ACTOR_AND_BLOG_MODE, + ), + ), + ), + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_attribution_domains', + array( + 'type' => 'string', + 'description' => 'Websites allowed to credit you.', + 'default' => home_host(), + 'sanitize_callback' => array( Sanitize::class, 'host_list' ), + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_allow_likes', + array( + 'type' => 'integer', + 'description' => 'Allow likes.', + 'default' => '1', + 'sanitize_callback' => 'absint', + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_allow_reposts', + array( + 'type' => 'integer', + 'description' => 'Allow reposts.', + 'default' => '1', + 'sanitize_callback' => 'absint', + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_auto_approve_reactions', + array( + 'type' => 'integer', + 'description' => 'Auto-approve Reactions.', + 'default' => '0', + 'sanitize_callback' => 'absint', + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_default_quote_policy', + array( + 'type' => 'string', + 'description' => 'Default quote policy for new posts.', + 'default' => ACTIVITYPUB_INTERACTION_POLICY_ANYONE, + 'sanitize_callback' => static function ( $value ) { + $allowed = array( + ACTIVITYPUB_INTERACTION_POLICY_ANYONE, + ACTIVITYPUB_INTERACTION_POLICY_FOLLOWERS, + ACTIVITYPUB_INTERACTION_POLICY_ME, + ); + return \in_array( $value, $allowed, true ) ? $value : ACTIVITYPUB_INTERACTION_POLICY_ANYONE; + }, + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_relays', + array( + 'type' => 'array', + 'description' => 'Relays', + 'default' => array(), + 'sanitize_callback' => array( Sanitize::class, 'url_list' ), + ) + ); + + \register_setting( + 'activitypub', + 'activitypub_site_blocked_actors', + array( + 'type' => 'array', + 'description' => 'Site-wide blocked ActivityPub actors.', + 'default' => array(), + 'sanitize_callback' => array( Sanitize::class, 'identifier_list' ), + ) + ); + + /* + * Options Group: activitypub_advanced + */ + \register_setting( + 'activitypub_advanced', + 'activitypub_outbox_purge_days', + array( + 'type' => 'integer', + 'description' => 'Number of days to keep items in the Outbox.', + 'default' => ACTIVITYPUB_OUTBOX_PURGE_DAYS, + 'sanitize_callback' => static function ( $value ) { + return \max( 1, \absint( $value ) ); + }, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_inbox_purge_days', + array( + 'type' => 'integer', + 'description' => 'Number of days to keep items in the Inbox.', + 'default' => ACTIVITYPUB_INBOX_PURGE_DAYS, + 'sanitize_callback' => static function ( $value ) { + return \max( 1, \absint( $value ) ); + }, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_ap_post_purge_days', + array( + 'type' => 'integer', + 'description' => 'Number of days to keep remote posts.', + 'default' => ACTIVITYPUB_AP_POST_PURGE_DAYS, + 'sanitize_callback' => static function ( $value ) { + return \max( 1, \absint( $value ) ); + }, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_vary_header', + array( + 'type' => 'boolean', + 'description' => 'Add the Vary header to the ActivityPub response.', + 'default' => true, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_content_negotiation', + array( + 'type' => 'boolean', + 'description' => 'Enable content negotiation.', + 'default' => true, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_authorized_fetch', + array( + 'type' => 'boolean', + 'description' => 'Require HTTP signature authentication.', + 'default' => false, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_rfc9421_signature', + array( + 'type' => 'boolean', + 'description' => 'Use RFC-9421 signature.', + 'default' => false, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_following_ui', + array( + 'type' => 'boolean', + 'description' => 'Show Following UI in admin menus and settings.', + 'default' => false, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_reader_ui', + array( + 'type' => 'boolean', + 'description' => 'Enable the Reader to view posts from accounts you follow.', + 'default' => false, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_create_posts', + array( + 'type' => 'boolean', + 'description' => 'Allow creating posts via ActivityPub.', + 'default' => false, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_api', + array( + 'type' => 'boolean', + 'description' => 'Enable the ActivityPub API to allow third-party clients.', + 'default' => false, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_object_type', + array( + 'type' => 'string', + 'description' => 'The Activity-Object-Type', + 'show_in_rest' => array( + 'schema' => array( + 'enum' => array( 'note', 'wordpress-post-format' ), + ), + ), + 'default' => ACTIVITYPUB_DEFAULT_OBJECT_TYPE, + ) + ); + + \register_setting( + 'activitypub_advanced', + 'activitypub_relay_mode', + array( + 'type' => 'integer', + 'description' => 'Enable relay mode to forward public activities to all followers.', + 'default' => 0, + 'sanitize_callback' => 'absint', + ) + ); + + /* + * Options Group: activitypub_blog + */ + \register_setting( + 'activitypub_blog', + 'activitypub_blog_description', + array( + 'type' => 'string', + 'description' => 'The Description of the Blog-User', + 'show_in_rest' => true, + 'default' => '', + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_blog_identifier', + array( + 'type' => 'string', + 'description' => 'The Identifier of the Blog-User', + 'show_in_rest' => true, + 'default' => Blog::get_default_username(), + 'sanitize_callback' => array( Sanitize::class, 'blog_identifier' ), + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_header_image', + array( + 'type' => 'integer', + 'description' => 'The Attachment-ID of the Sites Header-Image', + 'default' => null, + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_blog_user_mailer_new_dm', + array( + 'type' => 'integer', + 'description' => 'Send a notification when someone sends a user of the blog a direct message.', + 'default' => 1, + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_blog_user_mailer_new_follower', + array( + 'type' => 'integer', + 'description' => 'Send a notification when someone starts to follow a user of the blog.', + 'default' => 1, + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_blog_user_mailer_new_mention', + array( + 'type' => 'integer', + 'description' => 'Send a notification when someone mentions a user of the blog.', + 'default' => 1, + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_mailer_annual_report', + array( + 'type' => 'integer', + 'description' => 'Send the annual Fediverse Year in Review email.', + 'default' => 1, + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_mailer_monthly_report', + array( + 'type' => 'integer', + 'description' => 'Send a monthly Fediverse stats report email.', + 'default' => 0, + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_blog_user_also_known_as', + array( + 'type' => 'array', + 'description' => 'An array of URLs that the blog user is known by.', + 'default' => array(), + 'sanitize_callback' => array( Sanitize::class, 'identifier_list' ), + ) + ); + + \register_setting( + 'activitypub_blog', + 'activitypub_hide_social_graph', + array( + 'type' => 'integer', + 'description' => 'Hide Followers and Followings on Profile.', + 'default' => 0, + 'sanitize_callback' => 'absint', + 'show_in_rest' => true, + ) + ); + } + + /** + * Delete all options. + */ + public static function delete() { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'activitypub_%'" ); + } + + /** + * Pre-get option filter for the Actor-Mode. + * + * @param string|false $pre The pre-get option value. + * + * @return string|false The actor mode or false if it should not be filtered. + */ + public static function pre_option_activitypub_actor_mode( $pre ) { + if ( \defined( 'ACTIVITYPUB_SINGLE_USER_MODE' ) && ACTIVITYPUB_SINGLE_USER_MODE ) { + return ACTIVITYPUB_BLOG_MODE; + } + + if ( \defined( 'ACTIVITYPUB_DISABLE_USER' ) && ACTIVITYPUB_DISABLE_USER ) { + return ACTIVITYPUB_BLOG_MODE; + } + + if ( \defined( 'ACTIVITYPUB_DISABLE_BLOG_USER' ) && ACTIVITYPUB_DISABLE_BLOG_USER ) { + return ACTIVITYPUB_ACTOR_MODE; + } + + return $pre; + } + + /** + * Pre-get option filter for the Authorized Fetch. + * + * @param string $pre The pre-get option value. + * + * @return string If the constant is defined, return the value, otherwise return the pre-get option value. + */ + public static function pre_option_activitypub_authorized_fetch( $pre ) { + if ( ! \defined( 'ACTIVITYPUB_AUTHORIZED_FETCH' ) ) { + return $pre; + } + + if ( ACTIVITYPUB_AUTHORIZED_FETCH ) { + return '1'; + } + + return '0'; + } + + /** + * Pre-get option filter for the Vary Header. + * + * @param string $pre The pre-get option value. + * + * @return string If the constant is defined, return the value, otherwise return the pre-get option value. + */ + public static function pre_option_activitypub_vary_header( $pre ) { + if ( ! \defined( 'ACTIVITYPUB_SEND_VARY_HEADER' ) ) { + return $pre; + } + + if ( ACTIVITYPUB_SEND_VARY_HEADER ) { + return '1'; + } + + return '0'; + } + + /** + * Pre-get option filter for the Following UI. + * + * Forces the Following UI to be enabled when the Reader is enabled. + * + * @param string $pre The pre-get option value. + * + * @return string If the Reader is enabled, return '1', otherwise return the pre-get option value. + */ + public static function pre_option_activitypub_following_ui( $pre ) { + /* + * Bypass the filter to get the actual stored value for activitypub_reader_ui. + * This avoids infinite loops if activitypub_reader_ui also had a pre_option filter. + */ + if ( \get_option( 'activitypub_reader_ui', '0' ) ) { + return '1'; + } + + return $pre; + } + + /** + * Pre-get option filter for the Create Posts setting. + * + * Forces the Create Posts setting to be enabled when the Reader is enabled. + * + * @param string $pre The pre-get option value. + * + * @return string If the Reader is enabled, return '1', otherwise return the pre-get option value. + */ + public static function pre_option_activitypub_create_posts( $pre ) { + if ( \get_option( 'activitypub_reader_ui', '0' ) ) { + return '1'; + } + + return $pre; + } + + /** + * Disallow interactions if the constant is set. + * + * @param bool $pre The value of the option. + * + * @return bool|string The value of the option. + */ + public static function maybe_disable_interactions( $pre ) { + if ( ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS ) { + return '0'; + } + + return $pre; + } + + /** + * Default option filter for the Content-Negotiation. + * + * @see https://github.com/Automattic/wordpress-activitypub/wiki/Caching + * + * @param string $default_value The default value of the option. + * + * @return string The default value of the option. + */ + public static function default_option_activitypub_negotiate_content( $default_value ) { + $disable_for_plugins = array( + 'wp-optimize/wp-optimize.php', + 'wp-rocket/wp-rocket.php', + 'w3-total-cache/w3-total-cache.php', + 'wp-fastest-cache/wp-fastest-cache.php', + 'sg-cachepress/sg-cachepress.php', + ); + + foreach ( $disable_for_plugins as $plugin ) { + if ( \is_plugin_active( $plugin ) ) { + return '0'; + } + } + + return $default_value; + } + + /** + * Default max image attachments. + * + * @param string $value The value of the option. + * + * @return string|int The value of the option. + */ + public static function default_max_image_attachments( $value ) { + if ( ! \is_numeric( $value ) ) { + $value = ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS; + } + + return $value; + } + + /** + * Ensure support post types is an array. + * + * @param string[] $value The value of the option. + * + * @return string[] The value of the option. + */ + public static function support_post_types_ensure_array( $value ) { + return (array) $value; + } + + /** + * Default object type. + * + * @param string $value The value of the option. + * + * @return string The value of the option. + */ + public static function default_object_type( $value ) { + if ( ! $value ) { + $value = ACTIVITYPUB_DEFAULT_OBJECT_TYPE; + } + + return $value; + } + + /** + * Sanitize purge day values. + * + * Ensures the value is a non-negative integer. Returns the + * registered default when the stored value is empty or false + * (option not properly set), but allows 0 to disable purging. + * + * @since 8.1.0 + * + * @param mixed $value The stored option value. + * + * @return int The sanitized value. + */ + public static function sanitize_purge_days( $value ) { + if ( '' === $value || false === $value ) { + $filter = \current_filter(); + $defaults = array( + 'option_activitypub_outbox_purge_days' => ACTIVITYPUB_OUTBOX_PURGE_DAYS, + 'option_activitypub_inbox_purge_days' => ACTIVITYPUB_INBOX_PURGE_DAYS, + 'option_activitypub_ap_post_purge_days' => ACTIVITYPUB_AP_POST_PURGE_DAYS, + ); + + return $defaults[ $filter ] ?? ACTIVITYPUB_OUTBOX_PURGE_DAYS; + } + + return \max( 1, \absint( $value ) ); + } + + /** + * Handle relay mode option changes. + * + * When relay mode is enabled, switch to blog-only mode and set username to "relay". + * When disabled, restore previous settings. + * + * @param mixed $old_value The old option value. + * @param mixed $new_value The new option value. + */ + public static function relay_mode_changed( $old_value, $new_value ) { + if ( $new_value && ! $old_value ) { + // Enabling relay mode. + // Store previous username and actor mode for restoration. + \update_option( 'activitypub_relay_previous_blog_identifier', \get_option( 'activitypub_blog_identifier' ) ); + \update_option( 'activitypub_relay_previous_actor_mode', \get_option( 'activitypub_actor_mode' ) ); + + // Set blog username to "relay". + \update_option( 'activitypub_blog_identifier', 'relay' ); + + // Switch to blog-only mode. + \update_option( 'activitypub_actor_mode', ACTIVITYPUB_BLOG_MODE ); + } elseif ( ! $new_value && $old_value ) { + // Disabling relay mode - restore previous settings. + $previous_identifier = \get_option( 'activitypub_relay_previous_blog_identifier' ); + $previous_actor_mode = \get_option( 'activitypub_relay_previous_actor_mode' ); + + if ( $previous_identifier ) { + \update_option( 'activitypub_blog_identifier', $previous_identifier ); + \delete_option( 'activitypub_relay_previous_blog_identifier' ); + } + + if ( $previous_actor_mode ) { + \update_option( 'activitypub_actor_mode', $previous_actor_mode ); + \delete_option( 'activitypub_relay_previous_actor_mode' ); + } + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-post-types.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-post-types.php new file mode 100644 index 00000000..88a69f74 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-post-types.php @@ -0,0 +1,1022 @@ + array( + 'name' => \_x( 'Followers', 'post_type plural name', 'activitypub' ), + 'singular_name' => \_x( 'Follower', 'post_type single name', 'activitypub' ), + ), + 'public' => false, + 'show_in_rest' => true, + 'hierarchical' => false, + 'rewrite' => false, + 'query_var' => false, + 'delete_with_user' => false, + 'can_export' => true, + 'supports' => array( 'custom-fields' ), + ) + ); + + // Register meta for Remote Actors post type. + \register_post_meta( + Remote_Actors::POST_TYPE, + '_activitypub_inbox', + array( + 'type' => 'string', + 'single' => true, + 'sanitize_callback' => 'sanitize_url', + ) + ); + + \register_post_meta( + Remote_Actors::POST_TYPE, + '_activitypub_errors', + array( + 'type' => 'string', + 'single' => false, + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + \register_post_meta( + Remote_Actors::POST_TYPE, + Followers::FOLLOWER_META_KEY, + array( + 'type' => 'string', + 'single' => false, + 'show_in_rest' => true, + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + } + + /** + * Register the Inbox post type and its meta. + */ + public static function register_inbox_post_type() { + \register_post_type( + Inbox::POST_TYPE, + array( + 'labels' => array( + 'name' => \_x( 'Inbox', 'post_type plural name', 'activitypub' ), + 'singular_name' => \_x( 'Inbox Item', 'post_type single name', 'activitypub' ), + ), + 'capabilities' => array( + 'create_posts' => false, + ), + 'map_meta_cap' => true, + 'public' => false, + 'show_in_rest' => false, + 'rewrite' => false, + 'query_var' => false, + 'supports' => array( 'title', 'editor', 'author', 'custom-fields' ), + 'delete_with_user' => true, + 'can_export' => true, + 'exclude_from_search' => true, + ) + ); + + // Register meta for Inbox post type. + \register_post_meta( + Inbox::POST_TYPE, + '_activitypub_object_id', + array( + 'type' => 'string', + 'single' => true, + 'description' => 'The ID (ActivityPub URI) of the object that the inbox item is about.', + 'sanitize_callback' => 'sanitize_url', + ) + ); + + \register_post_meta( + Inbox::POST_TYPE, + '_activitypub_activity_type', + array( + 'type' => 'string', + 'description' => 'The type of the activity', + 'single' => true, + 'show_in_rest' => true, + 'sanitize_callback' => static function ( $value ) { + $schema = array( + 'type' => 'string', + 'enum' => Activity::TYPES, + 'default' => 'Create', + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + + \register_post_meta( + Inbox::POST_TYPE, + '_activitypub_activity_remote_actor', + array( + 'type' => 'string', + 'single' => true, + 'description' => 'The ID (ActivityPub URI) of the remote actor that sent the activity.', + 'sanitize_callback' => 'sanitize_url', + ) + ); + + \register_post_meta( + Inbox::POST_TYPE, + 'activitypub_content_visibility', + array( + 'type' => 'string', + 'single' => true, + 'show_in_rest' => true, + 'sanitize_callback' => static function ( $value ) { + $schema = array( + 'type' => 'string', + 'enum' => array( ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC, ACTIVITYPUB_CONTENT_VISIBILITY_QUIET_PUBLIC, ACTIVITYPUB_CONTENT_VISIBILITY_PRIVATE, ACTIVITYPUB_CONTENT_VISIBILITY_LOCAL ), + 'default' => ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC, + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + + \register_post_meta( + Inbox::POST_TYPE, + '_activitypub_user_id', + array( + 'type' => 'integer', + 'single' => false, // Allow multiple values - one per recipient. + 'description' => 'User ID of a recipient of this activity. Multiple entries allowed.', + 'sanitize_callback' => 'absint', + 'show_in_rest' => true, + ) + ); + } + + /** + * Register the Outbox post type and its meta. + */ + public static function register_outbox_post_type() { + \register_post_type( + Outbox::POST_TYPE, + array( + 'labels' => array( + 'name' => \_x( 'Outbox', 'post_type plural name', 'activitypub' ), + 'singular_name' => \_x( 'Outbox Item', 'post_type single name', 'activitypub' ), + ), + 'capabilities' => array( + 'create_posts' => false, + ), + 'map_meta_cap' => true, + 'public' => false, + 'show_in_rest' => false, + 'rewrite' => false, + 'query_var' => false, + 'supports' => array( 'title', 'editor', 'author', 'custom-fields' ), + 'delete_with_user' => true, + 'can_export' => true, + 'exclude_from_search' => true, + ) + ); + + // Register meta for Outbox post type. + /** + * Register Activity Type meta for Outbox items. + * + * @see https://www.w3.org/TR/activitystreams-vocabulary/#activity-types + */ + \register_post_meta( + Outbox::POST_TYPE, + '_activitypub_activity_type', + array( + 'type' => 'string', + 'description' => 'The type of the activity', + 'single' => true, + 'show_in_rest' => true, + 'sanitize_callback' => static function ( $value ) { + $schema = array( + 'type' => 'string', + 'enum' => Activity::TYPES, + 'default' => 'Announce', + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + + \register_post_meta( + Outbox::POST_TYPE, + '_activitypub_activity_actor', + array( + 'type' => 'string', + 'single' => true, + 'show_in_rest' => true, + 'sanitize_callback' => static function ( $value ) { + $schema = array( + 'type' => 'string', + 'enum' => array( 'application', 'blog', 'user' ), + 'default' => 'user', + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + + \register_post_meta( + Outbox::POST_TYPE, + '_activitypub_outbox_offset', + array( + 'type' => 'integer', + 'single' => true, + 'description' => 'Keeps track of the followers offset when processing outbox items.', + 'sanitize_callback' => 'absint', + 'default' => 0, + ) + ); + + \register_post_meta( + Outbox::POST_TYPE, + '_activitypub_object_id', + array( + 'type' => 'string', + 'single' => true, + 'description' => 'The ID (ActivityPub URI) of the object that the outbox item is about.', + 'sanitize_callback' => 'sanitize_url', + ) + ); + + \register_post_meta( + Outbox::POST_TYPE, + 'activitypub_content_visibility', + array( + 'type' => 'string', + 'single' => true, + 'show_in_rest' => true, + 'sanitize_callback' => static function ( $value ) { + $schema = array( + 'type' => 'string', + 'enum' => array( ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC, ACTIVITYPUB_CONTENT_VISIBILITY_QUIET_PUBLIC, ACTIVITYPUB_CONTENT_VISIBILITY_PRIVATE, ACTIVITYPUB_CONTENT_VISIBILITY_LOCAL ), + 'default' => ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC, + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + } + + /** + * Register the Post post type. + */ + public static function register_post_post_type() { + \register_post_type( + Remote_Posts::POST_TYPE, + array( + 'labels' => array( + 'name' => \_x( 'Posts', 'post_type plural name', 'activitypub' ), + 'singular_name' => \_x( 'Post', 'post_type single name', 'activitypub' ), + ), + 'capabilities' => array( + 'activitypub' => true, + ), + 'map_meta_cap' => true, + 'public' => false, + 'show_in_rest' => true, + 'rewrite' => false, + 'query_var' => false, + 'supports' => array( 'title', 'editor', 'author', 'custom-fields', 'excerpt', 'comments' ), + 'delete_with_user' => true, + 'can_export' => true, + 'exclude_from_search' => true, + 'taxonomies' => array( 'ap_tag', 'ap_object_type' ), + ) + ); + + \register_taxonomy( + 'ap_tag', + array( Remote_Posts::POST_TYPE ), + array( + 'public' => false, + 'query_var' => true, + 'show_in_rest' => true, + ) + ); + + \register_taxonomy( + 'ap_object_type', + array( Remote_Posts::POST_TYPE ), + array( + 'public' => false, + 'query_var' => true, + 'show_in_rest' => true, + ) + ); + + \register_post_meta( + Remote_Posts::POST_TYPE, + '_activitypub_remote_actor_id', + array( + 'type' => 'integer', + 'single' => true, + 'description' => 'The local ID of the remote actor that created the object.', + 'sanitize_callback' => 'absint', + ) + ); + + \register_post_meta( + Remote_Posts::POST_TYPE, + '_activitypub_user_id', + array( + 'type' => 'integer', + 'single' => true, + 'description' => 'The ID of the local user that received the activity.', + 'sanitize_callback' => 'absint', + ) + ); + } + + /** + * Register the Extra Fields post types. + */ + public static function register_extra_fields_post_types() { + $extra_field_args = array( + 'labels' => array( + 'name' => \_x( 'Extra fields', 'post_type plural name', 'activitypub' ), + 'singular_name' => \_x( 'Extra field', 'post_type single name', 'activitypub' ), + 'add_new' => \__( 'Add new', 'activitypub' ), + 'add_new_item' => \__( 'Add new extra field', 'activitypub' ), + 'new_item' => \__( 'New extra field', 'activitypub' ), + 'edit_item' => \__( 'Edit extra field', 'activitypub' ), + 'view_item' => \__( 'View extra field', 'activitypub' ), + 'all_items' => \__( 'All extra fields', 'activitypub' ), + ), + 'public' => false, + 'hierarchical' => false, + 'query_var' => false, + 'has_archive' => false, + 'publicly_queryable' => false, + 'show_in_menu' => false, + 'delete_with_user' => true, + 'can_export' => true, + 'exclude_from_search' => true, + 'show_in_rest' => true, + 'map_meta_cap' => true, + 'show_ui' => true, + 'supports' => array( 'title', 'editor', 'page-attributes', 'author' ), + 'capabilities' => array( + 'create_posts' => 'activitypub', // Require activitypub capability to create extra fields. + 'edit_others_posts' => 'do_not_allow', // Disallow editing others' Extra Fields (only own ones). + ), + ); + + \register_post_type( Extra_Fields::USER_POST_TYPE, $extra_field_args ); + + // Blog Extra Fields require manage_options capability. + $extra_field_args['capabilities'] = array( 'create_posts' => 'manage_options' ); + \register_post_type( Extra_Fields::BLOG_POST_TYPE, $extra_field_args ); + + /** + * Fires after ActivityPub custom post types have been registered. + */ + \do_action( 'activitypub_after_register_post_type' ); + } + + /** + * Register OAuth 2.0 post types for C2S support. + * + * Registers post type for OAuth clients. + * Note: Tokens are stored in user meta and authorization codes in transients. + */ + public static function register_oauth_post_types() { + // OAuth Clients post type. + \register_post_type( + Client::POST_TYPE, + array( + 'labels' => array( + 'name' => \_x( 'OAuth Clients', 'post_type plural name', 'activitypub' ), + 'singular_name' => \_x( 'OAuth Client', 'post_type single name', 'activitypub' ), + ), + 'public' => false, + 'show_in_rest' => false, + 'hierarchical' => false, + 'rewrite' => false, + 'query_var' => false, + 'delete_with_user' => false, + 'can_export' => true, + 'supports' => array( 'title', 'editor', 'custom-fields' ), + 'exclude_from_search' => true, + ) + ); + + // OAuth Client meta. + \register_post_meta( + Client::POST_TYPE, + '_activitypub_client_id', + array( + 'type' => 'string', + 'single' => true, + 'description' => 'Unique OAuth client identifier (UUID).', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + \register_post_meta( + Client::POST_TYPE, + '_activitypub_client_secret_hash', + array( + 'type' => 'string', + 'single' => true, + 'description' => 'SHA-256 hash of the client secret (null for public clients).', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + \register_post_meta( + Client::POST_TYPE, + '_activitypub_redirect_uris', + array( + 'type' => 'array', + 'single' => true, + 'description' => 'Allowed redirect URIs for this client.', + 'sanitize_callback' => static function ( $value ) { + if ( ! is_array( $value ) ) { + return array(); + } + return array_map( array( Sanitize::class, 'redirect_uri' ), $value ); + }, + ) + ); + + \register_post_meta( + Client::POST_TYPE, + '_activitypub_allowed_scopes', + array( + 'type' => 'array', + 'single' => true, + 'description' => 'Allowed OAuth scopes for this client.', + 'sanitize_callback' => array( Scope::class, 'sanitize' ), + ) + ); + + \register_post_meta( + Client::POST_TYPE, + '_activitypub_is_public', + array( + 'type' => 'boolean', + 'single' => true, + 'description' => 'Whether this is a public client (PKCE-only, no secret).', + 'sanitize_callback' => 'rest_sanitize_boolean', + 'default' => true, + ) + ); + + \register_post_meta( + Client::POST_TYPE, + Token::USER_META_KEY, + array( + 'type' => 'integer', + 'single' => false, + 'description' => 'User IDs that have active tokens for this client.', + 'sanitize_callback' => 'absint', + ) + ); + } + + /** + * Register the ap_tombstone post type. + * + * Stores local tombstone URLs out of the autoloaded options row. + * The post type is fully internal — never queried publicly, never shown in UI. + * + * @since 8.3.0 + */ + public static function register_tombstone_post_type() { + \register_post_type( + Tombstone::POST_TYPE, + array( + 'public' => false, + 'publicly_queryable' => false, + 'show_ui' => false, + 'show_in_menu' => false, + 'show_in_nav_menus' => false, + 'show_in_admin_bar' => false, + 'show_in_rest' => false, + 'exclude_from_search' => true, + 'has_archive' => false, + 'rewrite' => false, + 'query_var' => false, + 'can_export' => false, + 'delete_with_user' => false, + 'supports' => array(), + ) + ); + } + + /** + * Register post meta for ActivityPub supported post types. + */ + public static function register_activitypub_post_meta() { + $ap_post_types = \get_post_types_by_support( 'activitypub' ); + foreach ( $ap_post_types as $post_type ) { + \register_post_meta( + $post_type, + 'activitypub_content_warning', + array( + 'show_in_rest' => true, + 'single' => true, + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + \register_post_meta( + $post_type, + 'activitypub_content_visibility', + array( + 'type' => 'string', + 'single' => true, + 'show_in_rest' => true, + 'sanitize_callback' => static function ( $value ) { + $schema = array( + 'type' => 'string', + 'enum' => array( ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC, ACTIVITYPUB_CONTENT_VISIBILITY_QUIET_PUBLIC, ACTIVITYPUB_CONTENT_VISIBILITY_PRIVATE, ACTIVITYPUB_CONTENT_VISIBILITY_LOCAL ), + 'default' => ACTIVITYPUB_CONTENT_VISIBILITY_PUBLIC, + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + + \register_post_meta( + $post_type, + 'activitypub_max_image_attachments', + array( + 'type' => 'integer', + 'single' => true, + 'show_in_rest' => true, + 'default' => \get_option( 'activitypub_max_image_attachments', ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS ), + 'sanitize_callback' => 'absint', + ) + ); + + \register_post_meta( + $post_type, + 'activitypub_interaction_policy_quote', + array( + 'type' => 'string', + 'single' => true, + 'show_in_rest' => true, + 'default' => \get_option( 'activitypub_default_quote_policy', ACTIVITYPUB_INTERACTION_POLICY_ANYONE ), + 'sanitize_callback' => static function ( $value ) { + $schema = array( + 'type' => 'string', + 'enum' => array( ACTIVITYPUB_INTERACTION_POLICY_ANYONE, ACTIVITYPUB_INTERACTION_POLICY_FOLLOWERS, ACTIVITYPUB_INTERACTION_POLICY_ME ), + 'default' => ACTIVITYPUB_INTERACTION_POLICY_ANYONE, + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + + \register_post_meta( + $post_type, + 'activitypub_status', + array( + 'type' => 'string', + 'single' => true, + 'show_in_rest' => true, + 'sanitize_callback' => static function ( $value ) { + // Allow empty values to pass through without setting a default. + if ( empty( $value ) ) { + return ''; + } + + $schema = array( + 'type' => 'string', + 'enum' => array( + ACTIVITYPUB_OBJECT_STATE_PENDING, + ACTIVITYPUB_OBJECT_STATE_FEDERATED, + ACTIVITYPUB_OBJECT_STATE_FAILED, + ACTIVITYPUB_OBJECT_STATE_DELETED, + ), + 'default' => '', + ); + + if ( \is_wp_error( \rest_validate_enum( $value, $schema, '' ) ) ) { + return $schema['default']; + } + + return $value; + }, + ) + ); + } + } + + /** + * Register REST field for ap_actor posts. + */ + public static function register_ap_actor_rest_field() { + \register_rest_field( + Remote_Actors::POST_TYPE, + 'activitypub_json', + array( + /** + * Get the raw post content without WordPress content filtering. + * + * @param array $response Prepared response array. + * @return string The raw post content. + */ + 'get_callback' => static function ( $response ) { + return \get_post_field( 'post_content', $response['id'] ); + }, + 'schema' => array( + 'description' => 'Raw ActivityPub JSON data without WordPress content filtering', + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ) + ); + + // Add formatted actor data field. + \register_rest_field( + Remote_Actors::POST_TYPE, + 'actor_info', + array( + 'get_callback' => function ( $response ) { + $actor = Remote_Actors::get_actor( $response['id'] ); + if ( \is_wp_error( $actor ) ) { + return null; + } + return array( + 'username' => $actor->get_preferred_username(), + 'name' => $actor->get_name() ?? $actor->get_preferred_username(), + 'icon' => object_to_uri( $actor->get_icon() ), + 'url' => object_to_uri( $actor->get_url() ?? $actor->get_id() ), + 'webfinger' => Remote_Actors::get_acct( $response['id'] ), + 'identifier' => $actor->get_id(), + ); + }, + 'schema' => array( + 'description' => 'Parsed ActivityPub actor information', + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + ), + ) + ); + + // Add follow status field. + \register_rest_field( + Remote_Actors::POST_TYPE, + 'follow_status', + array( + 'get_callback' => function ( $response ) { + $current_user_id = \get_current_user_id(); + if ( ! $current_user_id ) { + return array( 'follows_back' => false ); + } + return array( + 'follows_back' => Following::check_status( $current_user_id, $response['id'] ), + ); + }, + 'schema' => array( + 'description' => 'Follow relationship status', + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + ), + ) + ); + + // Add custom query parameter for filtering by follower relationships. + \add_filter( 'rest_ap_actor_query', array( self::class, 'filter_ap_actor_query_by_follower' ), 10, 2 ); + } + + /** + * Filter WP_Query args to support follower_of parameter. + * + * @param array $args Array of arguments for WP_Query. + * @param \WP_REST_Request $request The REST API request. + * @return array Modified query arguments. + */ + public static function filter_ap_actor_query_by_follower( $args, $request ) { + if ( ! empty( $request['follower_of'] ) ) { + // Add meta_query to filter by _activitypub_following. + if ( ! isset( $args['meta_query'] ) ) { + $args['meta_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + } + + $args['meta_query'][] = array( + 'key' => Followers::FOLLOWER_META_KEY, + 'value' => $request['follower_of'], + ); + } + + return $args; + } + + /** + * Register a REST field for the ap_post post type to embed remote actor data. + */ + public static function register_ap_post_actor_rest_field() { + \register_rest_field( + Remote_Posts::POST_TYPE, + 'actor_info', + array( + /** + * Get the remote actor data for an ap_post. + * + * @param array $response Prepared response array. + * @return array|null The actor data or null if not found. + */ + 'get_callback' => function ( $response ) { + $id = \get_post_meta( $response['id'], '_activitypub_remote_actor_id', true ); + $actor = Remote_Actors::get_actor( $id ); + + if ( \is_wp_error( $actor ) ) { + return null; + } + + return array( + 'username' => $actor->get_preferred_username(), + 'name' => $actor->get_name() ?? $actor->get_preferred_username(), + 'icon' => object_to_uri( $actor->get_icon() ), + 'url' => object_to_uri( $actor->get_url() ?? $actor->get_id() ), + 'webfinger' => Remote_Actors::get_acct( $id ), + 'identifier' => $actor->get_id(), + ); + }, + 'schema' => array( + 'description' => 'Remote actor data', + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + ), + ) + ); + } + + /** + * Register custom REST API parameters for ap_post endpoint. + */ + public static function register_ap_post_rest_params() { + \add_filter( + 'rest_' . Remote_Posts::POST_TYPE . '_collection_params', + function ( $params ) { + $params['user_id'] = array( + 'description' => __( 'Filter posts by user ID (0 for site/blog actor).', 'activitypub' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + ); + + $params['ap_object_type'] = array( + 'description' => 'Filter posts by ActivityPub object type.', + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + 'minimum' => 0, + ), + ); + + $params['ap_tag'] = array( + 'description' => 'Filter posts by ActivityPub tag (term IDs).', + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + 'minimum' => 0, + ), + ); + + return $params; + } + ); + } + + /** + * Filter ap_post REST query to only show posts for the current user. + * + * @param array $args Query arguments. + * @param \WP_REST_Request $request The REST API request. + * + * @return array Modified query arguments. + */ + public static function filter_ap_post_by_user( $args, $request ) { + $ap_tag = $request->get_param( 'ap_tag' ); + if ( ! empty( $ap_tag ) ) { + if ( ! isset( $args['tax_query'] ) ) { + $args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query + } + + $args['tax_query'][] = array( + 'taxonomy' => 'ap_tag', + 'field' => 'term_id', + 'terms' => $ap_tag, + ); + + return $args; + } + + // Filter by user_id (defaults to current user, use 0 for site/blog actor). + $user_id = isset( $request['user_id'] ) ? (int) $request['user_id'] : \get_current_user_id(); + + if ( ! isset( $args['meta_query'] ) ) { + $args['meta_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + } + + $args['meta_query'][] = array( + 'key' => '_activitypub_user_id', + 'value' => $user_id, + 'compare' => '=', + ); + + // Filter by object type if provided. + if ( ! empty( $request['ap_object_type'] ) ) { + if ( ! isset( $args['tax_query'] ) ) { + $args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query + } + + $args['tax_query'][] = array( + 'taxonomy' => 'ap_object_type', + 'field' => 'term_id', + 'terms' => $request['ap_object_type'], + ); + } + + return $args; + } + + /** + * Register user_id parameter for ap_object_type taxonomy REST API. + * + * @param array $params Existing collection parameters. + * + * @return array Modified collection parameters. + */ + public static function register_object_type_user_param( $params ) { + $params['user_id'] = array( + 'description' => __( 'Filter terms to those with posts from this user ID.', 'activitypub' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + ); + + return $params; + } + + /** + * Filter ap_object_type REST query to only return terms that have posts for the given user. + * + * Uses a direct SQL query to efficiently get term IDs without loading all post IDs. + * + * @param array $args Query arguments. + * @param \WP_REST_Request $request The REST API request. + * + * @return array Modified query arguments. + */ + public static function filter_object_type_by_user( $args, $request ) { + $user_id = $request->get_param( 'user_id' ); + if ( null === $user_id ) { + return $args; + } + + global $wpdb; + + // Get term IDs that have at least one ap_post for this user. + $term_ids = $wpdb->get_col( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->prepare( + "SELECT DISTINCT tt.term_id + FROM {$wpdb->term_taxonomy} tt + INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id + INNER JOIN {$wpdb->posts} p ON tr.object_id = p.ID + INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id + WHERE tt.taxonomy = 'ap_object_type' + AND p.post_type = 'ap_post' + AND pm.meta_key = '_activitypub_user_id' + AND pm.meta_value = %s", + $user_id + ) + ); + + if ( empty( $term_ids ) ) { + // Force empty result. + $term_ids = array( 0 ); + } + + $args['include'] = \array_map( 'intval', $term_ids ); + + return $args; + } + + /** + * Prevent empty or default meta values. + * + * @param null|bool $check Whether to allow updating metadata for the given type. + * @param int $object_id ID of the object metadata is for. + * @param string $meta_key Metadata key. + * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + */ + public static function prevent_empty_post_meta( $check, $object_id, $meta_key, $meta_value ) { + $post_metas = array( + 'activitypub_content_visibility' => '', + 'activitypub_content_warning' => '', + 'activitypub_max_image_attachments' => (string) \get_option( 'activitypub_max_image_attachments', ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS ), + ); + + if ( isset( $post_metas[ $meta_key ] ) && $post_metas[ $meta_key ] === (string) $meta_value ) { + if ( 'update_post_metadata' === current_action() ) { + \delete_post_meta( $object_id, $meta_key ); + } + + $check = true; + } + + return $check; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-query.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-query.php new file mode 100644 index 00000000..89c44390 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-query.php @@ -0,0 +1,436 @@ +activitypub_object ) { + return $this->activitypub_object; + } + + if ( $this->prepare_activitypub_data() ) { + return $this->activitypub_object; + } + + $queried_object = $this->get_queried_object(); + $transformer = Factory::get_transformer( $queried_object ); + + if ( $transformer && ! \is_wp_error( $transformer ) ) { + $this->activitypub_object = $transformer->to_object(); + } + + return $this->activitypub_object; + } + + /** + * Get the ActivityPub object ID. + * + * @return string The ActivityPub object ID. + */ + public function get_activitypub_object_id() { + if ( $this->activitypub_object_id ) { + return $this->activitypub_object_id; + } + + if ( $this->prepare_activitypub_data() ) { + return $this->activitypub_object_id; + } + + $queried_object = $this->get_queried_object(); + $transformer = Factory::get_transformer( $queried_object ); + + if ( $transformer && ! \is_wp_error( $transformer ) ) { + $this->activitypub_object_id = $transformer->to_id(); + } + + return $this->activitypub_object_id; + } + + /** + * Prepare and set both ActivityPub object and ID for Outbox activities and virtual objects. + * + * @return bool True if an object was found and set, false otherwise. + */ + private function prepare_activitypub_data() { + $queried_object = $this->get_queried_object(); + + if ( $queried_object instanceof \WP_Post && \get_query_var( 'stamp' ) ) { + return $this->maybe_get_stamp(); + } + + // Check for Outbox Activity. + if ( + $queried_object instanceof \WP_Post && + Outbox::POST_TYPE === $queried_object->post_type + ) { + $activitypub_object = Outbox::maybe_get_activity( $queried_object ); + + // Check if the Outbox Activity is public. + if ( ! \is_wp_error( $activitypub_object ) ) { + $this->activitypub_object = $activitypub_object; + $this->activitypub_object_id = $this->activitypub_object->get_id(); + return true; + } + } + + if ( ! $queried_object ) { + // If the object is not a valid ActivityPub object, try to get a virtual object. + $activitypub_object = $this->maybe_get_virtual_object(); + + if ( $activitypub_object ) { + $this->activitypub_object = $activitypub_object; + $this->activitypub_object_id = $this->activitypub_object->get_id(); + return true; + } + } + + return false; + } + + /** + * Get the queried object. + * + * This adds support for Comments by `?c=123` IDs and Users by `?author=123` and `@username` IDs. + * + * @return \WP_Term|\WP_Post_Type|\WP_Post|\WP_User|\WP_Comment|null The queried object. + */ + public function get_queried_object() { + $queried_object = \get_queried_object(); + + // Check Comment by ID. + if ( ! $queried_object ) { + $comment_id = \get_query_var( 'c' ); + if ( $comment_id ) { + $queried_object = \get_comment( $comment_id ); + } + } + + // Check Post by ID (works for custom post types). + if ( ! $queried_object ) { + $post_id = \get_query_var( 'p' ); + if ( $post_id ) { + $queried_object = \get_post( $post_id ); + } + } + + // Check Term by ID. + if ( ! $queried_object ) { + $term_id = \get_query_var( 'term_id' ); + if ( $term_id ) { + $queried_object = \get_term( $term_id ); + } + } + + // Try to get Author by ID. + if ( ! $queried_object ) { + $url = $this->get_request_url(); + $author_id = url_to_authorid( $url ); + if ( $author_id ) { + $queried_object = \get_user_by( 'id', $author_id ); + } + } + + /** + * Filters the queried object. + * + * @param \WP_Term|\WP_Post_Type|\WP_Post|\WP_User|\WP_Comment|null $queried_object The queried object. + */ + return apply_filters( 'activitypub_queried_object', $queried_object ); + } + + /** + * Get the virtual object. + * + * Virtual objects are objects that are not stored in the database, but are created on the fly. + * The plugins currently supports two virtual objects: The Blog-Actor and the Application-Actor. + * + * @see \Activitypub\Model\Blog + * @see \Activitypub\Model\Application + * + * @return object|null The virtual object. + */ + protected function maybe_get_virtual_object() { + $url = $this->get_request_url(); + + if ( ! $url ) { + return null; + } + + $author_id = url_to_authorid( $url ); + + if ( ! is_numeric( $author_id ) ) { + $author_id = $url; + } + + $user = Actors::get_by_various( $author_id ); + + if ( \is_wp_error( $user ) || ! $user ) { + return null; + } + + return $user; + } + + /** + * Get the request URL. + * + * @return string|null The request URL. + */ + public function get_request_url() { + if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { + return null; + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $url = \wp_unslash( $_SERVER['REQUEST_URI'] ); + $url = \WP_Http::make_absolute_url( $url, \home_url() ); + $url = \sanitize_url( $url ); + + return $url; + } + + /** + * Check if the current request is an ActivityPub request. + * + * @return bool True if the request is an ActivityPub request, false otherwise. + */ + public function is_activitypub_request() { + if ( ! isset( $this->is_activitypub_request ) ) { + global $wp_query; + + $this->is_activitypub_request = false; + + // One can trigger an ActivityPub request by adding `?activitypub` to the URL. + if ( isset( $wp_query->query_vars['activitypub'] ) || isset( $_GET['activitypub'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + \defined( 'ACTIVITYPUB_REQUEST' ) || \define( 'ACTIVITYPUB_REQUEST', true ); + $this->is_activitypub_request = true; + + // The other (more common) option to make an ActivityPub request is to send an Accept header. + } elseif ( isset( $_SERVER['HTTP_ACCEPT'] ) ) { + $accept = \sanitize_text_field( \wp_unslash( $_SERVER['HTTP_ACCEPT'] ) ); + + /* + * $accept can be a single value, or a comma separated list of values. + * We want to support both scenarios, + * and return true when the header includes at least one of the following: + * - application/activity+json + * - application/ld+json + * - application/json + */ + if ( \preg_match( '/(application\/(ld\+json|activity\+json|json))/i', $accept ) ) { + \defined( 'ACTIVITYPUB_REQUEST' ) || \define( 'ACTIVITYPUB_REQUEST', true ); + $this->is_activitypub_request = true; + } + } + } + + /** + * Filters whether the current request is an ActivityPub request. + * + * @param bool $is_activitypub_request True if the request is an ActivityPub request, false otherwise. + */ + return \apply_filters( 'activitypub_is_activitypub_request', $this->is_activitypub_request ); + } + + /** + * Check if content negotiation is allowed for a request. + * + * @return bool True if content negotiation is allowed, false otherwise. + */ + public function should_negotiate_content() { + $return = false; + $always_negotiate = array( 'p', 'c', 'author', 'actor', 'stamp', 'preview', 'activitypub' ); + $url = \wp_parse_url( $this->get_request_url(), PHP_URL_QUERY ); + $query = array(); + \wp_parse_str( $url, $query ); + + // Check if any of the query params are in the `$always_negotiate` array. + if ( \array_intersect( \array_keys( $query ), $always_negotiate ) ) { + $return = true; + } + + if ( \get_option( 'activitypub_content_negotiation', '1' ) ) { + $return = true; + } + + if ( \is_author() && \get_user_option( 'activitypub_use_permalink_as_id', \get_queried_object_id() ) ) { + $return = true; + } + + /** + * Filters whether content negotiation should be forced. + * + * @param bool $return Whether content negotiation should be forced. + */ + return \apply_filters( 'activitypub_should_negotiate_content', $return ); + } + + /** + * Check if the current request is from the old host. + * + * @return bool True if the request is from the old host, false otherwise. + */ + public function is_old_host_request() { + if ( isset( $this->is_old_host_request ) ) { + return $this->is_old_host_request; + } + + $old_host = \get_option( 'activitypub_old_host' ); + + if ( ! $old_host ) { + $this->is_old_host_request = false; + return false; + } + + $request_host = isset( $_SERVER['HTTP_HOST'] ) ? \sanitize_text_field( \wp_unslash( $_SERVER['HTTP_HOST'] ) ) : ''; + $referer_host = isset( $_SERVER['HTTP_REFERER'] ) ? \wp_parse_url( \sanitize_text_field( \wp_unslash( $_SERVER['HTTP_REFERER'] ) ), PHP_URL_HOST ) : ''; + + // Check if the domain matches either the request domain or referer. + $check = $old_host === $request_host || $old_host === $referer_host; + $this->is_old_host_request = $check; + + return $check; + } + + /** + * Fake an old host request. + * + * @param bool $state Optional. The state to set. Default true. + */ + public function set_old_host_request( $state = true ) { + $this->is_old_host_request = $state; + } + + /** + * Maybe get a QuoteAuthorization object from a stamp. + * + * @return bool True if the object was prepared, false otherwise. + */ + private function maybe_get_stamp() { + require_once ABSPATH . 'wp-admin/includes/post.php'; + + $stamp = \get_query_var( 'stamp' ); + $meta = \get_post_meta_by_id( (int) $stamp ); + + if ( ! $meta ) { + return false; + } + + $post = $this->get_queried_object(); + + // Ensure the meta belongs to the queried post to prevent arbitrary meta disclosure. + if ( (int) $meta->post_id !== $post->ID ) { + return false; + } + + $user_uri = get_user_id( $post->post_author ); + + if ( ! $user_uri ) { + return false; + } + + $stamp_uri = \add_query_arg( + array( + 'p' => $post->ID, + 'stamp' => $meta->meta_id, + ), + \home_url( '/' ) + ); + + $activitypub_object = new Quote_Authorization(); + $activitypub_object->set_id( $stamp_uri ); + $activitypub_object->set_attributed_to( $user_uri ); + $activitypub_object->set_interacting_object( $meta->meta_value ); + $activitypub_object->set_interaction_target( get_post_id( $post->ID ) ); + + $this->activitypub_object = $activitypub_object; + $this->activitypub_object_id = $activitypub_object->get_id(); + + return true; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-relay.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-relay.php new file mode 100644 index 00000000..769437f3 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-relay.php @@ -0,0 +1,81 @@ +set_type( 'Announce' ); + $announce->set_actor( Actors::BLOG_USER_ID ); + $announce->set_object( $activity ); + $announce->set_published( gmdate( ACTIVITYPUB_DATE_TIME_RFC3339 ) ); + + // Add to outbox for distribution. The outbox will generate the ID. + Outbox::add( $announce, Actors::BLOG_USER_ID ); + } + + /** + * Unhook settings fields when relay mode is enabled. + * + * Removes all settings sections except moderation when relay mode is active. + */ + public static function unhook_settings_fields() { + global $wp_settings_sections; + + if ( ! isset( $wp_settings_sections['activitypub_settings'] ) ) { + return; + } + + // Keep only the moderation section. + foreach ( $wp_settings_sections['activitypub_settings'] as $section_id => $section ) { + if ( 'activitypub_moderation' !== $section_id ) { + unset( $wp_settings_sections['activitypub_settings'][ $section_id ] ); + } + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-router.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-router.php new file mode 100644 index 00000000..e51cced7 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-router.php @@ -0,0 +1,383 @@ +get_activitypub_object(); + + if ( Tombstone::exists_local( Query::get_instance()->get_request_url() ) ) { + // Set 410 Gone for permanently deleted posts, 200 OK for soft-deleted. + if ( ! $activitypub_object ) { + \status_header( 410 ); + } + + return ACTIVITYPUB_PLUGIN_DIR . 'templates/tombstone-json.php'; + } + + $activitypub_template = false; + + if ( $activitypub_object ) { + if ( \get_query_var( 'preview' ) ) { + \define( 'ACTIVITYPUB_PREVIEW', true ); + + /** + * Filter the template used for the ActivityPub preview. + * + * @param string $activitypub_template Absolute path to the template file. + */ + $activitypub_template = apply_filters( 'activitypub_preview_template', ACTIVITYPUB_PLUGIN_DIR . '/templates/post-preview.php' ); + } else { + $activitypub_template = ACTIVITYPUB_PLUGIN_DIR . 'templates/activitypub-json.php'; + } + } + + /* + * Check if the request is authorized. + * + * @see https://www.w3.org/wiki/SocialCG/ActivityPub/Primer/Authentication_Authorization#Authorized_fetch + * @see https://swicg.github.io/activitypub-http-signature/#authorized-fetch + */ + if ( $activitypub_template && use_authorized_fetch() ) { + $verification = Signature::verify_http_signature( $_SERVER ); + if ( \is_wp_error( $verification ) ) { + \status_header( 401 ); + + // Fallback as template_loader can't return http headers. + return $template; + } + } + + if ( $activitypub_template ) { + \set_query_var( 'is_404', false ); + + // Check if header already sent. + if ( ! \headers_sent() ) { + // Send 200 status header. + \status_header( 200 ); + } + + return $activitypub_template; + } + + return $template; + } + + /** + * Add the 'self' link to the header. + */ + public static function add_headers() { + $id = Query::get_instance()->get_activitypub_object_id(); + + /* + * Send CORS headers for resolved ActivityPub objects and outbox + * items. Outbox items need CORS even when the object ID doesn't + * resolve, because browser preflight requests don't carry the + * Authorization header needed to authenticate private items. + */ + $post_id = \get_query_var( 'p' ); + $is_outbox_url = $post_id && Outbox::POST_TYPE === \get_post_type( $post_id ); + + if ( ! \headers_sent() && ( $id || $is_outbox_url ) ) { + \header( 'Access-Control-Allow-Origin: *' ); + \header( 'Access-Control-Allow-Methods: GET, OPTIONS' ); + \header( 'Access-Control-Allow-Headers: Accept, Authorization, Content-Type' ); + } + + if ( ! $id ) { + return; + } + + if ( ! \headers_sent() ) { + \header( 'Link: <' . esc_url( $id ) . '>; title="ActivityPub (JSON)"; rel="alternate"; type="application/activity+json"', false ); + + if ( \get_option( 'activitypub_vary_header', '1' ) ) { + // Send Vary header for Accept header. + \header( 'Vary: Accept', false ); + } + } + + \add_action( + 'wp_head', + static function () use ( $id ) { + echo PHP_EOL . '' . PHP_EOL; + } + ); + } + + /** + * Remove trailing slash from ActivityPub @username requests. + * + * @param string $redirect_url The URL to redirect to. + * @param string $requested_url The requested URL. + * + * @return string $redirect_url The possibly-unslashed redirect URL. + */ + public static function no_trailing_redirect( $redirect_url, $requested_url ) { + if ( get_query_var( 'actor' ) ) { + return $requested_url; + } + + return $redirect_url; + } + + /** + * Add support for `p` and `author` query vars. + * + * @param string $redirect_url The URL to redirect to. + * @param string $requested_url The requested URL. + * + * @return string $redirect_url + */ + public static function redirect_canonical( $redirect_url, $requested_url ) { + if ( ! is_activitypub_request() ) { + return $redirect_url; + } + + $query = \wp_parse_url( $requested_url, PHP_URL_QUERY ); + + if ( ! $query ) { + return $redirect_url; + } + + $query_params = \wp_parse_args( $query ); + unset( $query_params['activitypub'] ); + unset( $query_params['stamp'] ); + + if ( 1 !== count( $query_params ) ) { + return $redirect_url; + } + + if ( isset( $query_params['p'] ) ) { + return null; + } + + if ( isset( $query_params['author'] ) ) { + return null; + } + + return $requested_url; + } + + /** + * Custom redirects for ActivityPub requests. + * + * @return void + */ + public static function template_redirect() { + global $wp_query; + + $comment_id = \get_query_var( 'c', null ); + + // Check if it seems to be a comment. + if ( $comment_id ) { + $comment = \get_comment( $comment_id ); + + // Load a 404-page if `c` is set but not valid. + if ( ! $comment ) { + $wp_query->set_404(); + return; + } + + // Stop if it's not an ActivityPub comment. + if ( is_activitypub_request() && ! is_local_comment( $comment ) ) { + return; + } + + \wp_safe_redirect( get_comment_link( $comment ) ); + exit; + } + + $actor = \get_query_var( 'actor', null ); + if ( $actor ) { + $actor = Actors::get_by_username( $actor ); + if ( ! $actor || \is_wp_error( $actor ) ) { + $wp_query->set_404(); + return; + } + + if ( is_activitypub_request() ) { + return; + } + + \wp_safe_redirect( $actor->get_url(), 301 ); + exit; + } + + $term_id = \get_query_var( 'term_id', null ); + if ( $term_id ) { + $term = \get_term( $term_id ); + + // Load a 404-page if `term_id` is set but not valid. + if ( ! $term || \is_wp_error( $term ) ) { + $wp_query->set_404(); + return; + } + + /** + * Filters the taxonomies supported for term redirects. + * + * @since 7.8.3 + * + * @param array $supported_taxonomies Array of taxonomy names. Default array( 'category', 'post_tag' ). + */ + $supported_taxonomies = \apply_filters( 'activitypub_supported_taxonomies', array( 'category', 'post_tag' ) ); + + if ( ! in_array( $term->taxonomy, $supported_taxonomies, true ) ) { + return; + } + + // Don't redirect for ActivityPub requests. + if ( is_activitypub_request() ) { + return; + } + + $term_link = \get_term_link( $term ); + if ( ! \is_wp_error( $term_link ) ) { + \wp_safe_redirect( $term_link, 301 ); + exit; + } + } + } + + /** + * Add the 'activitypub' query variable so WordPress won't mangle it. + * + * @param array $vars The query variables. + * + * @return array The query variables. + */ + public static function add_query_vars( $vars ) { + $vars[] = 'activitypub'; + $vars[] = 'preview'; + $vars[] = 'author'; + $vars[] = 'actor'; + $vars[] = 'stamp'; + $vars[] = 'type'; + $vars[] = 'c'; + $vars[] = 'p'; + $vars[] = 'term_id'; + + return $vars; + } + + /** + * Optimize home page query for ActivityPub requests. + * + * Skip the database query entirely for ActivityPub requests on the home page + * since we only need to return the blog actor, not posts. + * + * @param \WP_Query $wp_query The WP_Query instance. + */ + public static function fix_is_home_check( $wp_query ) { + if ( + $wp_query->get( 'actor' ) || + $wp_query->get( 'stamp' ) || + $wp_query->get( 'c' ) + ) { + $wp_query->is_home = false; + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-sanitize.php b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-sanitize.php new file mode 100644 index 00000000..73e1be8e --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/includes/class-sanitize.php @@ -0,0 +1,560 @@ + + */ + const STRIP_ELEMENTS = array( + 'script', + 'style', + 'button', + 'nav', + 'form', + 'textarea', + 'select', + 'input', + 'fieldset', + 'iframe', + 'embed', + 'object', + ); + + /** + * MathML global attributes allowed per the W3C MathML safe list. + * + * @see https://w3c.github.io/mathml-docs/mathml-safe-list + * + * @var array + */ + const MATHML_GLOBAL_ATTRS = array( + 'dir' => true, + 'displaystyle' => true, + 'mathbackground' => true, + 'mathcolor' => true, + 'mathsize' => true, + 'scriptlevel' => true, + 'intent' => true, + 'arg' => true, + ); + + /** + * Sanitize a list of URLs. + * + * @param string|array $value The value to sanitize. + * @return array The sanitized list of URLs. + */ + public static function url_list( $value ) { + if ( ! \is_array( $value ) ) { + $value = \explode( PHP_EOL, (string) $value ); + } + + $value = \array_filter( $value ); + $value = \array_map( 'trim', $value ); + $value = \array_map( 'sanitize_url', $value ); + $value = \array_unique( $value ); + + return \array_values( $value ); + } + + /** + * Sanitize and normalize a list of account identifiers to ActivityPub IDs. + * + * This function processes various identifier formats, such as URLs and + * webfinger identifiers, and normalizes them into a consistent format. + * + * @param string|array $value The value to sanitize. + * + * @return array The sanitized and normalized list of account identifiers. + */ + public static function identifier_list( $value ) { + if ( ! \is_array( $value ) ) { + $value = \explode( PHP_EOL, (string) $value ); + } + + $value = \array_filter( $value ); + $uris = array(); + + foreach ( $value as $uri ) { + $uri = \trim( $uri ); + $uri = \ltrim( $uri, '@' ); + + if ( \is_email( $uri ) ) { + $_uri = Webfinger::resolve( $uri ); + if ( \is_wp_error( $_uri ) ) { + $uris[] = $uri; + continue; + } + + $uri = $_uri; + } + + $uri = \sanitize_url( $uri ); + $actor = Remote_Actors::fetch_by_uri( $uri ); + if ( \is_wp_error( $actor ) ) { + $uris[] = $uri; + } else { + $uris[] = \sanitize_url( $actor->guid ); + } + } + + return \array_values( \array_unique( $uris ) ); + } + + /** + * Sanitize a list of hosts. + * + * @param string $value The value to sanitize. + * @return string The sanitized list of hosts. + */ + public static function host_list( $value ) { + $value = \explode( PHP_EOL, (string) $value ); + $value = \array_map( + static function ( $host ) { + $host = \trim( $host ); + $host = \strtolower( $host ); + $host = \set_url_scheme( $host ); + $host = \sanitize_url( $host, array( 'http', 'https' ) ); + + // Remove protocol. + if ( \str_contains( $host, 'http' ) ) { + $host = \wp_parse_url( $host, PHP_URL_HOST ); + } + + return \filter_var( $host, FILTER_VALIDATE_DOMAIN ); + }, + $value + ); + + return \implode( PHP_EOL, \array_filter( $value ) ); + } + + /** + * Sanitize a blog identifier. + * + * @param string $value The value to sanitize. + * @return string The sanitized blog identifier. + */ + public static function blog_identifier( $value ) { + // Hack to allow dots in the username. + $parts = \explode( '.', (string) $value ); + $sanitized = \array_map( 'sanitize_title', $parts ); + $sanitized = \implode( '.', $sanitized ); + + if ( empty( $sanitized ) ) { + return Blog::get_default_username(); + } + + // Check for login or nicename. + $user = new \WP_User_Query( + array( + 'search' => $sanitized, + 'search_columns' => array( 'user_login', 'user_nicename' ), + 'number' => 1, + 'hide_empty' => true, + 'fields' => 'ID', + ) + ); + + if ( $user->get_results() ) { + \add_settings_error( + 'activitypub_blog_identifier', + 'activitypub_blog_identifier', + \esc_html__( 'You cannot use an existing author’s name for the blog profile ID.', 'activitypub' ) + ); + + return Blog::get_default_username(); + } + + return $sanitized; + } + + /** + * Get the sanitized value of a constant. + * + * @param mixed $value The constant value. + * + * @return string The sanitized value. + */ + public static function constant_value( $value ) { + if ( is_bool( $value ) ) { + return $value ? 'true' : 'false'; + } + + if ( is_string( $value ) ) { + return esc_attr( $value ); + } + + if ( is_array( $value ) ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r + return print_r( $value, true ); + } + + return $value; + } + + /** + * Sanitize a webfinger identifier. + * + * @param string $value The value to sanitize. + * + * @return string The sanitized webfinger identifier. + */ + public static function webfinger( $value ) { + $value = \str_replace( 'acct:', '', $value ); + $value = \trim( $value, '@' ); + + return $value; + } + + /** + * Sanitize content for ActivityPub. + * + * @param string $content The content to convert. + * + * @return string The converted content. + */ + public static function content( $content ) { + // Only make URLs clickable if no anchor tags exist, to avoid corrupting existing links. + if ( false === \strpos( $content, '[\n\r\t]+<', $content ) ); + } + + /** + * Sanitize a redirect URI, preserving custom protocol schemes. + * + * WordPress's sanitize_url() and esc_url_raw() strip unknown protocols. + * This method extracts the scheme and passes it as allowed so custom + * URI schemes for native apps (RFC 8252 Section 7.1) are preserved. + * + * @since 8.1.0 + * + * @param string $uri The redirect URI to sanitize. + * @return string The sanitized URI. + */ + public static function redirect_uri( $uri ) { + /* + * Extract scheme manually because wp_parse_url() returns false + * for URIs like "myapp://" (scheme + empty authority, no path). + */ + if ( ! preg_match( '/^([a-zA-Z][a-zA-Z0-9+.\-]*):/', $uri, $matches ) ) { + return ''; + } + + $scheme = \strtolower( $matches[1] ); + + // For standard schemes, use default sanitization. + if ( in_array( $scheme, array( 'http', 'https' ), true ) ) { + return \sanitize_url( $uri ); + } + + // For custom schemes, include the scheme in allowed protocols. + return \sanitize_url( $uri, array_merge( \wp_allowed_protocols(), array( $scheme ) ) ); + } + + /** + * Clean HTML for ActivityPub federation. + * + * Uses a positive allowlist based on FEP-b2b8 (Long-form Text) for the + * `content` property, extended with common WordPress content elements. + * Interactive, navigational, and scripting elements are stripped entirely. + * + * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/b2b8/fep-b2b8.md + * @see https://github.com/Automattic/wordpress-activitypub/issues/2619 + * + * @param string $content The HTML content to clean. + * + * @return string The cleaned HTML content. + */ + public static function clean_html( $content ) { + if ( empty( $content ) ) { + return $content; + } + + /* + * Strip elements whose inner content is noise (scripts, styles, interactive UI, embeds). + * This runs before wp_kses because wp_kses strips tags but keeps inner text, + * and content inside + +

+

+

+

+

+ + + + + + + + + + + + + + + + + +
+ + + +
in_reply_to
post_type
+

+ diff --git a/wp-content/upgrade-temp-backup/plugins/activitypub/templates/welcome.php b/wp-content/upgrade-temp-backup/plugins/activitypub/templates/welcome.php new file mode 100644 index 00000000..abf22af0 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/activitypub/templates/welcome.php @@ -0,0 +1,20 @@ + + +
+ +
+ +
diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/.editorconfig b/wp-content/upgrade-temp-backup/plugins/wp-piwik/.editorconfig new file mode 100644 index 00000000..682a2be1 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.php] +indent_style = tab +indent_size = 4 diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/.gitignore b/wp-content/upgrade-temp-backup/plugins/wp-piwik/.gitignore new file mode 100644 index 00000000..bc00fe3c --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/.gitignore @@ -0,0 +1,5 @@ + +.idea/ +node_modules/ +vendor/ + diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/LICENSE b/wp-content/upgrade-temp-backup/plugins/wp-piwik/LICENSE new file mode 100644 index 00000000..733c0723 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/LICENSE @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/README.md b/wp-content/upgrade-temp-backup/plugins/wp-piwik/README.md new file mode 100644 index 00000000..51ab1815 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/README.md @@ -0,0 +1,9 @@ +# Connect Matomo (former WP-Matomo, WP-Piwik) + +This [WordPress](https://wordpress.org) plugin adds a [Matomo](http://matomo.org) stats site to your blog's dashboard. It's also able to add the Matomo tracking code to your blog. + +## How to use this plugin + +To use this plugin you will need your own Matomo instance. If you do not already have a Matomo setup, you have two simple options: use either [self-hosted](http://matomo.org/) or [cloud-hosted](http://matomo.org/hosting/). + +This repository was created to develop and maintain Connect Matomo (WP-Matomo, WP-Piwik). Please see the WordPress plugin directory if you like to use this plugin: https://wordpress.org/plugins/wp-piwik/ diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/bitcoin.png b/wp-content/upgrade-temp-backup/plugins/wp-piwik/bitcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..e565fabb08a97a2f30e82db9b8919fd77dc13480 GIT binary patch literal 2020 zcmaJ?dpr|*8`nn~#fa*aX-02(3#m@A*350SMAMl|Dc5c;3!69@rqGct*vYBnmXO)z zQld?<$fcCYYO~W~W5zCWNn6;Av-k79=X3sg-#?z;_n+VId4AvL@_lX`N283^TCCO4 z(J}Hmg2ZU?+`mnKjrPQe?)qzC)g=tdL#MvqQl_H=DDy(P`zNoODsDS^G05cC{7(HW z^9L$@W)>wp{GW)d5oAyGnV8)ppqvb-RM))Fu)3#u-oOVLVL9KTQ4Y7kxoSxXV#>{+ zF(sgm+Ll^M9ZYqkM=!nKf&&b#y4?OhA!98daA%B1FY4Ivn>QaC@811qXk1_bfcuW?SG5=0Gi*5)~)5;N>IIk@s#w z(s>3#(x-i&*qES{Cf*^qb_D=X08?^a@{W(>rd_BR(4Dc5IYpr$%)w~Rp6GXV^YOA~ zM7OL#lY?#R8NH=-afrdMjO1qT4sz*_^?radE{Lz9YDYVCgToLAFd835;gLfRfWP*917LyR4}hf-V~!bCWi zSNrOf+lKy=%K%V?nVy8{vjIo?v}GK(fQP`%L5OedQ1`Q#)(3Xw z)=>B)js|1q0p|1`RiYYTs`V%`ehvZ~=ln*8CKcI+W-_g}#pRaQ@lCL2YSnUaRNKU8 ziv|N@eR`N071|;nrGhfm*@mN{t1eWhYX(oZ--gfomrk%BlVGYHyp+T)_UT~dI|>h~ z$<}7jI@t0F>YK3Hr@w6RWi4|)LR8q!)YR~p@7Uuu%6p+RD-_2cbotizF9uo{Cc}z< zlDRG~?di0ZNF*$chUh&rJ+1#?L?8&ggvYZl#`XUwS+9gVy0XyNKf{IvomyJ$`R0RH zlyjHG)ntsqU7D-tsOp1Qsq9}rxwAZ|&KI10`f8nK^PLp)QPF`SsgV;Fi**=}Sgm{3 z>})IxtIFK(qT=`y&&kd`S#Oc=xGCO4=9!}o4hiYrx2RI7UVIh`S1M8ogy=yYuekmo z4`G-#@}yoMwzm(ZcvU`JaW=A932+FmeXp23?qPY`v0Hbt=*J(BIqRNDhVd!8$ZnZC zf@>?~&gKCyU*ox`Kqz#1g4O3~2zc34xIV$$G}H{>X}=7E!D1GG-%kERH6#!`*Pzkp z>hmEQa&Pag*>!8eLQ>#vy4iro#{4V*+PFmx|5E$UEWbb zCX=6EV?u}`zR4%ykLPsyZ@Ua>>Df4t;9o-?&uvCtxh^l-Y+c#L-dcX)ep6$N6&TES zdinCD!`!m6axI!E{`za|k&6kf8{@CcM8I8G1wkaigzLoH&Fe;Ni;RZ z+Ic#vRh}Uh=s$BHo>%TgOy?tP#+vE~_6Ql4cuF-Y4b_k+)ByTdf3 zFYE&BxKd(*wJC(o4XvstKx$a6ZI%NP}d(cpR*BPnk}ri%ffjAOtdKvlMw zv9IF7fKkNW!VQA!33h0g#b6F>60Ul5qBKDPA!t7^shx4+&}p|R2z4oWz#Hg)`)OF{Us@Ar3?Y|(106{}O05AMsQHbz3pXT|ZzTH)TgyDdM7T*yZpTIn zFCE8~;DjX0`-eG(jn>2&nwefhshgZ}Vh1@dwOv+;p9`-C5^poDpMr!VN{lnomQ`dg zTF@hhwrnJa{yaGfQ4KNwt`o4)8s_zQzFMHYbT1DssmQWBMGz^TCC9mP$Nw8g!8h3+ zU89yGKZcEMl7KlK?9PpB8hQ*@XLUy_bF%9Bg#W)ES6vPd0xkhOY>|4#Pdco$Yg@ + * @package WP_Piwik + */ +class WP_Piwik { + + private static $revision_id = 2023092201; + private static $version = '1.1.9'; + private static $blog_id; + private static $plugin_basename = null; + private static $logger; + + /** + * @var \WP_Piwik\Settings + */ + private static $settings; + + private static $request; + private static $options_page_id; + + public $stats_page_id; + + /** + * Constructor class to configure and register all WP-Piwik components + */ + public function __construct() { + global $blog_id; + self::$blog_id = ( isset( $blog_id ) ? $blog_id : 'n/a' ); + $this->open_logger(); + $this->open_settings(); + $this->setup(); + $this->add_filters(); + $this->add_actions(); + $this->add_shortcodes(); + $this->set_up_ai_bot_tracking(); + } + + public static function get_settings() { + return self::$settings; + } + + /** + * Destructor class to finish logging + */ + public function __destruct() { + $this->close_logger(); + } + + /** + * Setup class to prepare settings and check for installation and update + */ + private function setup() { + self::$plugin_basename = plugin_basename( __FILE__ ); + if ( ! $this->is_installed() ) { + $this->install_plugin(); + } elseif ( $this->is_updated() ) { + $this->update_plugin(); + } + if ( $this->is_config_submitted() ) { + $this->apply_settings(); + } + self::$settings->save(); + } + + /** + * Register WordPress actions + */ + private function add_actions() { + if ( is_admin() ) { + add_action( + 'admin_menu', + array( + $this, + 'build_admin_menu', + ) + ); + add_action( + 'admin_post_save_wp-piwik_stats', + array( + $this, + 'on_stats_page_save_changes', + ) + ); + add_action( + 'load-post.php', + array( + $this, + 'add_post_metaboxes', + ) + ); + add_action( + 'load-post-new.php', + array( + $this, + 'add_post_metaboxes', + ) + ); + if ( $this->is_network_mode() ) { + add_action( + 'network_admin_notices', + array( + $this, + 'show_notices', + ) + ); + add_action( + 'network_admin_menu', + array( + $this, + 'build_network_admin_menu', + ) + ); + add_action( + 'update_site_option_blogname', + array( + $this, + 'on_blog_name_change', + ) + ); + add_action( + 'update_site_option_siteurl', + array( + $this, + 'on_site_url_change', + ) + ); + } else { + add_action( + 'admin_notices', + array( + $this, + 'show_notices', + ) + ); + add_action( + 'update_option_blogname', + array( + $this, + 'on_blog_name_change', + ) + ); + add_action( + 'update_option_siteurl', + array( + $this, + 'on_site_url_change', + ) + ); + } + if ( $this->is_dashboard_active() ) { + add_action( + 'wp_dashboard_setup', + array( + $this, + 'extend_word_press_dashboard', + ) + ); + } + } + if ( $this->is_toolbar_active() ) { + add_action( + is_admin() ? 'admin_head' : 'wp_head', + array( + $this, + 'load_toolbar_requirements', + ) + ); + add_action( + 'admin_bar_menu', + array( + $this, + 'extend_word_press_toolbar', + ), + 1000 + ); + } + if ( $this->is_tracking_active() ) { + if ( ! is_admin() || $this->is_admin_tracking_active() ) { + $prefix = is_admin() ? 'admin' : 'wp'; + add_action( + 'footer' === self::$settings->get_global_option( 'track_codeposition' ) ? $prefix . '_footer' : $prefix . '_head', + array( + $this, + 'add_javascript_code', + ) + ); + if ( self::$settings->get_global_option( 'dnsprefetch' ) ) { + add_action( + $prefix . '_head', + array( + $this, + 'add_dns_prefetch_tag', + ) + ); + } + if ( $this->is_add_no_script_code() ) { + add_action( + $prefix . '_footer', + array( + $this, + 'add_noscript_code', + ) + ); + } + } + if ( self::$settings->get_global_option( 'add_post_annotations' ) ) { + add_action( + 'transition_post_status', + array( + $this, + 'add_piwik_annotation', + ), + 10, + 3 + ); + } + } + } + + /** + * Register WordPress filters + */ + private function add_filters() { + if ( is_admin() ) { + add_filter( + 'plugin_row_meta', + array( + $this, + 'set_plugin_meta', + ), + 10, + 2 + ); + add_filter( + 'screen_layout_columns', + array( + $this, + 'on_screen_layout_columns', + ), + 10, + 2 + ); + } elseif ( $this->is_tracking_active() ) { + if ( $this->is_track_feed() ) { + add_filter( + 'the_excerpt_rss', + array( + $this, + 'add_feed_tracking', + ) + ); + add_filter( + 'the_content', + array( + $this, + 'add_feed_tracking', + ) + ); + } + if ( $this->is_add_feed_campaign() ) { + add_filter( + 'post_link', + array( + $this, + 'add_feed_campaign', + ) + ); + } + if ( $this->is_cross_domain_linking_enabled() ) { + add_filter( + 'wp_redirect', + array( + $this, + 'forward_cross_domain_visitor_id', + ) + ); + } + } + } + + /** + * Register WordPress shortcodes + */ + private function add_shortcodes() { + if ( $this->is_add_shortcode() ) { + add_shortcode( + 'wp-piwik', + array( + $this, + 'shortcode', + ) + ); + } + } + + /** + * Install WP-Piwik for the first time + */ + private function install_plugin( $is_update = false ) { + self::$logger->log( 'Running Connect Matomo installation' ); + if ( ! $is_update ) { + $this->add_notice( 'install', sprintf( __( '%1$s %2$s installed.', 'wp-piwik' ), self::$settings->get_not_empty_global_option( 'plugin_display_name' ), self::$version ), __( 'Next you should connect to Matomo', 'wp-piwik' ) ); + } + self::$settings->set_global_option( 'revision', self::$revision_id ); + self::$settings->set_global_option( 'last_settings_update', time() ); + } + + /** + * Uninstall WP-Piwik + */ + public function uninstall_plugin() { + self::$logger->log( 'Running Connect Matomo uninstallation' ); + if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { + exit(); + } + self::delete_word_press_option( 'wp-piwik-notices' ); + self::$settings->reset_settings(); + } + + /** + * Update WP-Piwik + */ + private function update_plugin() { + self::$logger->log( 'Upgrade Connect Matomo to ' . self::$version ); + $patches = glob( __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'update' . DIRECTORY_SEPARATOR . '*.php' ); + $is_patched = false; + if ( is_array( $patches ) ) { + sort( $patches ); + foreach ( $patches as $patch ) { + $patch_version = (int) pathinfo( $patch, PATHINFO_FILENAME ); + if ( $patch_version && self::$settings->get_global_option( 'revision' ) < $patch_version ) { + self::include_file( 'update' . DIRECTORY_SEPARATOR . $patch_version ); + $is_patched = true; + } + } + } + if ( + 'enabled' === self::$settings->get_global_option( 'update_notice' ) + || ( 'script' === self::$settings->get_global_option( 'update_notice' ) && $is_patched ) + ) { + $this->add_notice( 'update', sprintf( __( '%1$s updated to %2$s.', 'wp-piwik' ), self::$settings->get_not_empty_global_option( 'plugin_display_name' ), self::$version ), __( 'Please validate your configuration', 'wp-piwik' ) ); + } + $this->install_plugin( true ); + } + + /** + * Define a notice + * + * @param string $type + * identifier + * @param string $subject + * notice headline + * @param string $text + * notice content + * @param boolean $stay + * set to true if the message should persist (default: false) + */ + private function add_notice( $type, $subject, $text, $stay = false ) { + $notices = $this->get_word_press_option( 'wp-piwik-notices', array() ); + $notices[ $type ] = array( + 'subject' => $subject, + 'text' => $text, + 'stay' => $stay, + ); + $this->update_word_press_option( 'wp-piwik-notices', $notices ); + } + + /** + * Show all notices defined previously + * + * @see add_notice() + */ + public function show_notices() { + $notices = $this->get_word_press_option( 'wp-piwik-notices' ); + if ( ! empty( $notices ) ) { + if ( ! is_array( $notices ) ) { + $notices = array(); + } + + foreach ( $notices as $type => $notice ) { + printf( + '
', + esc_html( $notice ['subject'] ), + esc_html__( 'Important', 'wp-piwik' ), + esc_html( $notice ['text'] ), + esc_attr( $this->get_settings_url() ), + esc_html__( 'Settings', 'wp-piwik' ) + ); + if ( ! $notice ['stay'] ) { + unset( $notices [ $type ] ); + } + } + } + $this->update_word_press_option( 'wp-piwik-notices', $notices ); + } + + /** + * Get the settings page URL + * + * @return string settings page URL + */ + private function get_settings_url() { + return ( self::$settings->check_network_activation() ? 'settings' : 'options-general' ) . '.php?page=wp-matomo-settings'; + } + + /** + * Echo javascript tracking code + */ + public function add_javascript_code() { + if ( $this->is_hidden_user() ) { + self::$logger->log( 'Do not add tracking code to site (user should not be tracked) Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->get_option( 'site_id' ) ); + return; + } + $tracking_code = new WP_Piwik\TrackingCode( $this ); + $tracking_code->is_404 = ( is_404() && self::$settings->get_global_option( 'track_404' ) ); + $tracking_code->is_usertracking = 'disabled' !== self::$settings->get_global_option( 'track_user_id' ); + $tracking_code->is_search = ( is_search() && self::$settings->get_global_option( 'track_search' ) ); + self::$logger->log( 'Add tracking code. Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->get_option( 'site_id' ) ); + if ( $this->is_network_mode() && 'manually' === self::$settings->get_global_option( 'track_mode' ) ) { + $site_id = $this->get_piwik_site_id(); + if ( 'n/a' !== $site_id ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo str_replace( '{ID}', $site_id, $tracking_code->get_tracking_code() ); + } else { + echo ''; + } + } else { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $tracking_code->get_tracking_code(); + } + } + + /** + * Echo DNS prefetch tag + */ + public function add_dns_prefetch_tag() { + echo ''; + } + + /** + * Get Piwik Domain + */ + public function get_piwik_domain() { + switch ( self::$settings->get_global_option( 'piwik_mode' ) ) { + case 'php': + return '//' . wp_parse_url( self::$settings->get_global_option( 'proxy_url' ), PHP_URL_HOST ); + case 'cloud': + return '//' . self::$settings->get_global_option( 'piwik_user' ) . '.innocraft.cloud'; + case 'cloud-matomo': + return '//' . self::$settings->get_global_option( 'matomo_user' ) . '.matomo.cloud'; + default: + return '//' . wp_parse_url( self::$settings->get_global_option( 'piwik_url' ), PHP_URL_HOST ); + } + } + + /** + * Echo noscript tracking code + */ + public function add_noscript_code() { + if ( 'proxy' === self::$settings->get_global_option( 'track_mode' ) ) { + return; + } + if ( $this->is_hidden_user() ) { + self::$logger->log( 'Do not add noscript code to site (user should not be tracked) Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->get_option( 'site_id' ) ); + return; + } + self::$logger->log( 'Add noscript code. Blog ID: ' . self::$blog_id . ' Site ID: ' . self::$settings->get_option( 'site_id' ) ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo self::$settings->get_option( 'noscript_code' ) . "\n"; + } + + /** + * Register post view meta boxes + */ + public function add_post_metaboxes() { + if ( self::$settings->get_global_option( 'add_customvars_box' ) ) { + add_action( + 'add_meta_boxes', + array( + new WP_Piwik\Template\MetaBoxCustomVars( $this, self::$settings ), + 'addMetabox', + ) + ); + add_action( + 'save_post', + array( + new WP_Piwik\Template\MetaBoxCustomVars( $this, self::$settings ), + 'saveCustomVars', + ), + 10, + 2 + ); + } + if ( 'disabled' !== self::$settings->get_global_option( 'perpost_stats' ) ) { + add_action( + 'add_meta_boxes', + array( + $this, + 'onload_post_page', + ) + ); + } + } + + /** + * Register admin menu components + */ + public function build_admin_menu() { + if ( self::is_configured() ) { + $cap = 'wp-piwik_read_stats'; + if ( self::$settings->check_network_activation() ) { + global $current_user; + $user_roles = $current_user->roles; + $allowed = self::$settings->get_global_option( 'capability_read_stats' ); + if ( is_array( $user_roles ) && is_array( $allowed ) ) { + foreach ( $user_roles as $user_role ) { + if ( isset( $allowed[ $user_role ] ) && $allowed[ $user_role ] ) { + $cap = 'read'; + break; + } + } + } + } + $stats_page = new WP_Piwik\Admin\Statistics( $this, self::$settings ); + $this->stats_page_id = add_dashboard_page( + __( 'Matomo Statistics', 'wp-piwik' ), + self::$settings->get_not_empty_global_option( 'plugin_display_name' ), + $cap, + 'wp-piwik_stats', + array( + $stats_page, + 'show', + ) + ); + $this->load_admin_stats_header( $this->stats_page_id, $stats_page ); + } + if ( ! self::$settings->check_network_activation() ) { + $options_page = new WP_Piwik\Admin\Settings( $this, self::$settings ); + self::$options_page_id = add_options_page( + self::$settings->get_not_empty_global_option( 'plugin_display_name' ), + self::$settings->get_not_empty_global_option( 'plugin_display_name' ), + 'activate_plugins', + 'wp-matomo-settings', + array( + $options_page, + 'show', + ) + ); + $this->load_admin_settings_header( self::$options_page_id, $options_page ); + } + } + + /** + * Register network admin menu components + */ + public function build_network_admin_menu() { + if ( self::is_configured() ) { + $stats_page = new WP_Piwik\Admin\Network( $this, self::$settings ); + $this->stats_page_id = add_dashboard_page( + __( 'Matomo Statistics', 'wp-piwik' ), + self::$settings->get_not_empty_global_option( 'plugin_display_name' ), + 'manage_sites', + 'wp-piwik_stats', + array( + $stats_page, + 'show', + ) + ); + $this->load_admin_stats_header( $this->stats_page_id, $stats_page ); + } + $options_page = new WP_Piwik\Admin\Settings( $this, self::$settings ); + self::$options_page_id = add_submenu_page( + 'settings.php', + self::$settings->get_not_empty_global_option( 'plugin_display_name' ), + self::$settings->get_not_empty_global_option( 'plugin_display_name' ), + 'manage_sites', + 'wp-matomo-settings', + array( + $options_page, + 'show', + ) + ); + $this->load_admin_settings_header( self::$options_page_id, $options_page ); + } + + /** + * Register admin header extensions for stats page + * + * @param mixed $stats_page_id options page id + * @param mixed $stats_page options page object + */ + public function load_admin_stats_header( $stats_page_id, $stats_page ) { + add_action( + 'admin_print_scripts-' . $stats_page_id, + array( + $stats_page, + 'print_admin_scripts', + ) + ); + add_action( + 'admin_print_styles-' . $stats_page_id, + array( + $stats_page, + 'print_admin_styles', + ) + ); + add_action( + 'load-' . $stats_page_id, + array( + $this, + 'onload_stats_page', + ) + ); + } + + /** + * Register admin header extensions for settings page + * + * @param string $options_page_id options page id + * @param mixed $options_page options page object + */ + public function load_admin_settings_header( $options_page_id, $options_page ) { + add_action( + 'admin_head-' . $options_page_id, + array( + $options_page, + 'extend_admin_header', + ) + ); + add_action( + 'admin_print_styles-' . $options_page_id, + array( + $options_page, + 'print_admin_styles', + ) + ); + } + + /** + * Register WordPress dashboard widgets + */ + public function extend_word_press_dashboard() { + if ( current_user_can( 'wp-piwik_read_stats' ) ) { + if ( 'disabled' !== self::$settings->get_global_option( 'dashboard_widget' ) ) { + new WP_Piwik\Widget\Overview( + $this, + self::$settings, + 'dashboard', + 'side', + 'default', + array( + 'date' => self::$settings->get_global_option( 'dashboard_widget' ), + 'period' => 'day', + ) + ); + } + if ( self::$settings->get_global_option( 'dashboard_chart' ) ) { + new WP_Piwik\Widget\Chart( $this, self::$settings ); + } + if ( self::$settings->get_global_option( 'dashboard_ecommerce' ) ) { + new WP_Piwik\Widget\Ecommerce( $this, self::$settings ); + } + if ( self::$settings->get_global_option( 'dashboard_seo' ) ) { + new WP_Piwik\Widget\Seo( $this, self::$settings ); + } + } + } + + /** + * Register WordPress toolbar components + */ + public function extend_word_press_toolbar( $toolbar ) { + if ( current_user_can( 'wp-piwik_read_stats' ) && is_admin_bar_showing() ) { + $id = WP_Piwik\Request::register( + 'VisitsSummary.getUniqueVisitors', + array( + 'period' => 'day', + 'date' => 'last30', + ) + ); + $unique = $this->request( $id ); + $url = is_network_admin() ? $this->get_settings_url() : false; + $content = is_network_admin() ? __( 'Configure WP-Matomo', 'wp-piwik' ) : ''; + // Leave if result array does contain a message instead of valid data + if ( isset( $unique['result'] ) ) { + $content .= ''; + } elseif ( is_array( $unique ) ) { + $unique_count = count( $unique ); + + $labels = array(); + for ( $i = 0; $i < $unique_count; $i++ ) { + $labels [] = $i; + } + ob_start(); + ?> +
+ +
+ + get_stats_url(); + } + $toolbar->add_menu( + array( + 'id' => 'wp-piwik_stats', + 'title' => $content, + 'href' => $url, + ) + ); + } + } + + /** + * Add plugin meta data + * + * @param array $links + * list of already defined plugin meta data + * @param string $file + * handled file + * @return array complete list of plugin meta data + */ + public function set_plugin_meta( $links, $file ) { + if ( 'wp-piwik/wp-piwik.php' === $file && ( ! $this->is_network_mode() || is_network_admin() ) ) { + return array_merge( + $links, + array( + sprintf( '%s', esc_attr( self::get_settings_url() ), esc_html__( 'Settings', 'wp-piwik' ) ), + ) + ); + } + return $links; + } + + /** + * Prepare toolbar widget requirements + */ + public function load_toolbar_requirements() { + if ( is_admin_bar_showing() ) { + wp_enqueue_script( 'wp-piwik-chartjs', $this->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $this->get_plugin_version(), false ); + } + } + + /** + * Add tracking pixels to feed content + * + * @param string $content + * post content + * @return string|false post content extended by tracking pixel + */ + public function add_feed_tracking( $content ) { + global $post; + if ( is_feed() ) { + self::$logger->log( 'Add tracking image to feed entry.' ); + if ( ! self::$settings->get_option( 'site_id' ) ) { + $site_id = $this->request_piwik_site_id(); + if ( 'n/a' !== $site_id ) { + self::$settings->set_option( 'site_id', $site_id ); + } else { + return false; + } + } + $title = the_title( '', '', false ); + $posturl = get_permalink( $post->ID ); + $urlref = get_bloginfo( 'rss2_url' ); + if ( 'proxy' === self::$settings->get_global_option( 'track_mode' ) ) { + $url = plugins_url( 'wp-piwik' ) . '/proxy/matomo.php'; + } else { + $url = self::$settings->get_global_option( 'piwik_url' ); + if ( '/index.php' === substr( $url, -10, 10 ) ) { + $url = str_replace( '/index.php', '/matomo.php', $url ); + } else { + $url .= 'piwik.php'; + } + } + $tracking_image = $url . '?idsite=' . self::$settings->get_option( 'site_id' ) . '&rec=1&url=' . rawurlencode( $posturl ) . '&action_name=' . rawurlencode( $title ) . '&urlref=' . rawurlencode( $urlref ); + $content .= ''; + } + return $content; + } + + /** + * Add a campaign parameter to feed permalink + * + * @param string $permalink + * permalink + * @return string permalink extended by campaign parameter + */ + public function add_feed_campaign( $permalink ) { + global $post; + if ( is_feed() ) { + self::$logger->log( 'Add campaign to feed permalink.' ); + $sep = ( false === strpos( $permalink, '?' ) ? '?' : '&' ); + $permalink .= $sep . 'pk_campaign=' . rawurlencode( self::$settings->get_global_option( 'track_feed_campaign' ) ) . '&pk_kwd=' . rawurlencode( $post->post_name ); + } + return $permalink; + } + + /** + * Forwards the cross domain parameter pk_vid if the URL parameter is set and a user is about to be redirected. + * When another website links to WooCommerce with a pk_vid parameter, and WooCommerce redirects the user to another + * URL, the pk_vid parameter would get lost and the visitorId would later not be applied by the tracking code + * due to the lost pk_vid URL parameter. If the URL parameter is set, we make sure to forward this parameter. + * + * @param string $location + * + * @return string location extended by pk_vid URL parameter if the URL parameter is set + */ + public function forward_cross_domain_visitor_id( $location ) { + $pk_vid = ! empty( $_GET['pk_vid'] ) ? sanitize_key( wp_unslash( $_GET['pk_vid'] ) ) : null; + if ( ! empty( $pk_vid ) + && preg_match( '/^[a-zA-Z0-9]{24,48}$/', $pk_vid ) + ) { + // currently, the pk_vid parameter is 32 characters long, but it may vary over time. + $location = add_query_arg( 'pk_vid', $pk_vid, $location ); + } + + return $location; + } + + /** + * Apply settings update + * + * @return boolean settings update applied + * @phpcs:disable WordPress.Security.NonceVerification.Missing + */ + private function apply_settings() { + // TODO: shouldn't have to disable these + // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotValidated + // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + self::$settings->apply_changes( wp_unslash( $_POST['wp-piwik'] ) ); + self::$settings->set_global_option( 'revision', self::$revision_id ); + self::$settings->set_global_option( 'last_settings_update', time() ); + return true; + } + + /** + * Check if WP-Piwik is configured + * + * @return boolean Is WP-Piwik configured? + */ + public static function is_configured() { + return self::$settings->get_global_option( 'piwik_token' ) + && 'disabled' !== self::$settings->get_global_option( 'piwik_mode' ) + && ( + ( 'http' === self::$settings->get_global_option( 'piwik_mode' ) && self::$settings->get_global_option( 'piwik_url' ) ) + || ( 'php' === self::$settings->get_global_option( 'piwik_mode' ) && self::$settings->get_global_option( 'piwik_path' ) ) + || ( 'cloud' === self::$settings->get_global_option( 'piwik_mode' ) && self::$settings->get_global_option( 'piwik_user' ) ) + || ( 'cloud-matomo' === self::$settings->get_global_option( 'piwik_mode' ) && self::$settings->get_global_option( 'matomo_user' ) ) + ); + } + + /** + * Check if WP-Piwik was updated + * + * @return boolean Was WP-Piwik updated? + */ + private function is_updated() { + return self::$settings->get_global_option( 'revision' ) + && self::$settings->get_global_option( 'revision' ) < self::$revision_id; + } + + /** + * Check if WP-Piwik is already installed + * + * @return boolean Is WP-Piwik installed? + */ + private function is_installed() { + $old_settings = $this->get_word_press_option( 'wp-piwik_global-settings', false ); + if ( $old_settings && isset( $old_settings['revision'] ) ) { + self::log( 'Save old settings' ); + self::$settings->set_global_option( 'revision', $old_settings['revision'] ); + } else { + self::log( 'Current revision ' . self::$settings->get_global_option( 'revision' ) ); + } + return self::$settings->get_global_option( 'revision' ) > 0; + } + + /** + * Check if new settings were submitted + * + * @return boolean Are new settings submitted? + * @phpcs:disable WordPress.Security.NonceVerification.Missing + */ + public static function is_config_submitted() { + return isset( $_POST ['wp-piwik'] ) && self::is_valid_options_post(); + } + + /** + * Check if PHP mode is chosen + * + * @return bool Is PHP mode chosen? + */ + public function is_php_mode() { + return self::$settings->get_global_option( 'piwik_mode' ) && 'php' === self::$settings->get_global_option( 'piwik_mode' ); + } + + /** + * Check if WordPress is running in network mode + * + * @return boolean Is WordPress running in network mode? + */ + public function is_network_mode() { + return self::$settings->check_network_activation(); + } + + /** + * Check if a WP-Piwik dashboard widget is enabled + * + * @return boolean Is a dashboard widget enabled? + */ + private function is_dashboard_active() { + return self::$settings->get_global_option( 'dashboard_widget' ) || self::$settings->get_global_option( 'dashboard_chart' ) || self::$settings->get_global_option( 'dashboard_seo' ); + } + + /** + * Check if a WP-Piwik toolbar widget is enabled + * + * @return boolean Is a toolbar widget enabled? + */ + private function is_toolbar_active() { + return self::$settings->get_global_option( 'toolbar' ); + } + + /** + * Check if WP-Piwik tracking code insertion is enabled + * + * @return boolean Insert tracking code? + */ + private function is_tracking_active() { + return 'disabled' !== self::$settings->get_global_option( 'track_mode' ); + } + + /** + * Check if admin tracking is enabled + * + * @return boolean Is admin tracking enabled? + */ + private function is_admin_tracking_active() { + return self::$settings->get_global_option( 'track_admin' ) && is_admin(); + } + + /** + * Check if WP-Piwik noscript code insertion is enabled + * + * @return boolean Insert noscript code? + */ + private function is_add_no_script_code() { + return self::$settings->get_global_option( 'track_noscript' ); + } + + /** + * Check if feed tracking is enabled + * + * @return boolean Is feed tracking enabled? + */ + private function is_track_feed() { + return self::$settings->get_global_option( 'track_feed' ); + } + + /** + * Check if feed permalinks get a campaign parameter + * + * @return boolean Add campaign parameter to feed permalinks? + */ + private function is_add_feed_campaign() { + return self::$settings->get_global_option( 'track_feed_addcampaign' ); + } + + /** + * Check if feed permalinks get a campaign parameter + * + * @return boolean Add campaign parameter to feed permalinks? + */ + private function is_cross_domain_linking_enabled() { + return self::$settings->get_global_option( 'track_crossdomain_linking' ); + } + + /** + * Check if WP-Piwik shortcodes are enabled + * + * @return boolean Are shortcodes enabled? + */ + private function is_add_shortcode() { + return self::$settings->get_global_option( 'shortcodes' ); + } + + /** + * Define Piwik constants for PHP reporting API + * @phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedConstantFound + */ + public static function define_piwik_constants() { + if ( ! defined( 'PIWIK_INCLUDE_PATH' ) ) { + define( 'PIWIK_INCLUDE_PATH', self::$settings->get_global_option( 'piwik_path' ) ); + define( 'PIWIK_USER_PATH', self::$settings->get_global_option( 'piwik_path' ) ); + define( 'PIWIK_ENABLE_DISPATCH', false ); + define( 'PIWIK_ENABLE_ERROR_HANDLER', false ); + define( 'PIWIK_ENABLE_SESSION_START', false ); + } + } + + /** + * Start chosen logging method + */ + private function open_logger() { + self::$logger = \WP_Piwik\Logger::make_logger(); + } + + public static function get_logger() { + return self::$logger; + } + + /** + * Log a message + * + * @param string $message + * logger message + */ + public static function log( $message ) { + self::$logger->log( $message ); + } + + /** + * End logging + */ + private function close_logger() { + self::$logger = null; + } + + /** + * Load WP-Piwik settings + */ + private function open_settings() { + self::$settings = new WP_Piwik\Settings( $this ); + if ( ! $this->is_config_submitted() && $this->is_php_mode() && ! defined( 'PIWIK_INCLUDE_PATH' ) ) { + self::define_piwik_constants(); + } + } + + /** + * Include a WP-Piwik file + */ + private function include_file( $str_file ) { + self::$logger->log( 'Include ' . $str_file . '.php' ); + if ( is_file( WP_PIWIK_PATH . $str_file . '.php' ) ) { + include WP_PIWIK_PATH . $str_file . '.php'; + } + } + + /** + * Check if user should not be tracked + * + * @return boolean Do not track user? + */ + private function is_hidden_user() { + if ( is_multisite() ) { + foreach ( self::$settings->get_global_option( 'capability_stealth' ) as $key => $val ) { + if ( $val && current_user_can( $key ) ) { + return true; + } + } + } + return current_user_can( 'wp-piwik_stealth' ); + } + + /** + * Check if tracking code is up to date + * + * @return boolean Is tracking code up to date? + */ + public function is_current_tracking_code() { + return ( self::$settings->get_option( 'last_tracking_code_update' ) && self::$settings->get_option( 'last_tracking_code_update' ) > self::$settings->get_global_option( 'last_settings_update' ) ); + } + + /** + * DEPRECTAED Add javascript code to site header + * + * @deprecated + * + */ + public function site_header() { + self::$logger->log( 'Using deprecated function site_header' ); + $this->add_javascript_code(); + } + + /** + * DEPRECTAED Add javascript code to site footer + * + * @deprecated + * + */ + public function site_footer() { + self::$logger->log( 'Using deprecated function site_footer' ); + $this->add_noscript_code(); + } + + /** + * Identify new posts if an annotation is required + * and create Piwik annotation + * + * @param string $new_status + * new post status + * @param string $old_status + * new post status + * @param object $post + * current post object + */ + public function add_piwik_annotation( $new_status, $old_status, $post ) { + $enabled_post_types = self::$settings->get_global_option( 'add_post_annotations' ); + if ( isset( $enabled_post_types[ $post->post_type ] ) && $enabled_post_types[ $post->post_type ] && 'publish' !== $new_status && 'publish' !== $old_status ) { + $note = 'Published: ' . $post->post_title . ' - URL: ' . get_permalink( $post->ID ); + $id = WP_Piwik\Request::register( + 'Annotations.add', + array( + 'idSite' => $this->get_piwik_site_id(), + 'date' => gmdate( 'Y-m-d' ), + 'note' => $note, + ) + ); + $result = $this->request( $id ); + self::$logger->log( 'Add post annotation. ' . $note . ' - ' . wp_json_encode( $result ) ); + } + } + + /** + * Get WP-Piwik's URL + */ + public function get_plugin_url() { + return trailingslashit( plugin_dir_url( __DIR__ ) ); + } + + /** + * Get WP-Piwik's version + */ + public function get_plugin_version() { + return self::$version; + } + + /** + * Enable three columns for WP-Piwik stats screen + * + * @param array $columns full list of column settings + * @param mixed $screen current screen id + * @return array updated list of column settings + */ + public function on_screen_layout_columns( $columns, $screen ) { + if ( isset( $this->stats_page_id ) && (string) $screen === $this->stats_page_id ) { + $columns [ $this->stats_page_id ] = 3; + } + return $columns; + } + + /** + * Add tracking code to admin header. + */ + public function add_admin_header_tracking() { + $this->add_javascript_code(); + } + + /** + * Get option value + * + * @param string $key + * option key + * @return mixed option value + */ + public function get_option( $key ) { + return self::$settings->get_option( $key ); + } + + /** + * Get global option value + * + * @param string $key + * global option key + * @return mixed global option value + */ + public function get_global_option( $key ) { + return self::$settings->get_global_option( $key ); + } + + /** + * Get stats page URL + * + * @return string stats page URL + */ + public function get_stats_url() { + return admin_url() . '?page=wp-piwik_stats'; + } + + /** + * Perform a Piwik request + * + * @param string $id + * request ID + * @return mixed request result + */ + public function request( $id, $debug = false ) { + if ( 'disabled' === self::$settings->get_global_option( 'piwik_mode' ) ) { + return 'n/a'; + } + if ( ! isset( self::$request ) || empty( self::$request ) ) { + self::$request = ( 'http' === self::$settings->get_global_option( 'piwik_mode' ) || 'cloud' === self::$settings->get_global_option( 'piwik_mode' ) || 'cloud-matomo' === self::$settings->get_global_option( 'piwik_mode' ) ? new WP_Piwik\Request\Rest( $this, self::$settings ) : new WP_Piwik\Request\Php( $this, self::$settings ) ); + } + if ( $debug ) { + return self::$request->get_debug( $id ); + } + return self::$request->perform( $id ); + } + + /** + * Reset request object + */ + public function reset_request() { + if ( is_object( self::$request ) ) { + self::$request->reset(); + } + self::$request = null; + } + + /** + * Execute WP-Piwik shortcode + * + * @param array $attributes + * attribute list + */ + public function shortcode( $attributes ) { + shortcode_atts( + array( + 'title' => '', + 'module' => 'overview', + 'period' => 'day', + 'date' => 'yesterday', + 'limit' => 10, + 'width' => '100%', + 'height' => '200px', + 'idsite' => '', + 'language' => 'en', + 'range' => false, + 'key' => 'sum_daily_nb_uniq_visitors', + ), + $attributes + ); + $shortcode_object = new \WP_Piwik\Shortcode( $attributes, $this, self::$settings ); + return $shortcode_object->get(); + } + + /** + * Get Piwik site ID by blog ID + * + * @param int|string $blog_id + * which blog's Piwik site ID to get, default is the current blog + * @return mixed Piwik site ID or n/a + */ + public function get_piwik_site_id( $blog_id = null, $force_fetch = false ) { + if ( ! $blog_id && $this->is_network_mode() ) { + $blog_id = get_current_blog_id(); + } + $result = self::$settings->get_option( 'site_id' ); + self::$logger->log( 'Database result: ' . $result ); + return ( ! empty( $result ) && ! $force_fetch ? $result : $this->request_piwik_site_id( $blog_id ) ); + } + + /** + * Get a detailed list of all Piwik sites + * + * @return mixed Piwik sites + */ + public function get_piwik_site_details() { + $id = WP_Piwik\Request::register( 'SitesManager.getSitesWithAtLeastViewAccess', array() ); + $piwik_site_details = $this->request( $id ); + return $piwik_site_details; + } + + /** + * Estimate a Piwik site ID by blog ID + * + * @param int $blog_id + * which blog's Piwik site ID to estimate, default is the current blog + * @return mixed Piwik site ID or n/a + */ + private function request_piwik_site_id( $blog_id = null ) { + $is_current = ! self::$settings->check_network_activation() || empty( $blog_id ); + if ( self::$settings->get_global_option( 'auto_site_config' ) ) { + $id = WP_Piwik\Request::register( + 'SitesManager.getSitesIdFromSiteUrl', + array( + 'url' => $is_current ? get_bloginfo( 'url' ) : get_blog_details( $blog_id )->siteurl, + ) + ); + $result = $this->request( $id ); + $this->log( 'Tried to identify current site, result: ' . wp_json_encode( $result ) ); + if ( is_array( $result ) && empty( $result ) ) { + $result = $this->add_piwik_site( $blog_id ); + } elseif ( 'n/a' !== $result && isset( $result [0] ) ) { + $result = $result [0] ['idsite']; + } else { + $result = null; + } + } else { + $result = null; + } + self::$logger->log( 'Get Matomo ID: WordPress site ' . ( $is_current ? get_bloginfo( 'url' ) : get_blog_details( $blog_id )->siteurl ) . ' = Matomo ID ' . $result ); + if ( null !== $result ) { + self::$settings->set_option( 'site_id', $result, $blog_id ); + if ( 'disabled' !== self::$settings->get_global_option( 'track_mode' ) && 'manually' !== self::$settings->get_global_option( 'track_mode' ) ) { + $code = $this->update_tracking_code( $result, $blog_id ); + } + $this::$settings->save(); + return $result; + } + return 'n/a'; + } + + /** + * Add a new Piwik + * + * @param int $blog_id + * which blog's Piwik site to create, default is the current blog + * @return int|null Piwik site ID + * @phpcs:disable WordPress.NamingConventions.ValidHookName.UseUnderscores + * @phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound + */ + public function add_piwik_site( $blog_id = null ) { + $is_current = ! self::$settings->check_network_activation() || empty( $blog_id ); + // Do not add site if Piwik connection is unreliable + if ( ! $this->request( 'global.getPiwikVersion' ) ) { + return null; + } + $id = WP_Piwik\Request::register( + 'SitesManager.addSite', + array( + 'urls' => $is_current ? get_bloginfo( 'url' ) : get_blog_details( $blog_id )->siteurl, + 'siteName' => $is_current ? get_bloginfo( 'name' ) : get_blog_details( $blog_id )->blogname, + ) + ); + $result = $this->request( $id ); + if ( is_array( $result ) && isset( $result['value'] ) ) { + $result = (int) $result['value']; + } else { + $result = (int) $result; + } + self::$logger->log( 'Create Matomo ID: WordPress site ' . ( $is_current ? get_bloginfo( 'url' ) : get_blog_details( $blog_id )->siteurl ) . ' = Matomo ID ' . $result ); + if ( empty( $result ) ) { + return null; + } else { + // check disabled for bacwards compatibility + do_action( 'wp-piwik_site_created', $result ); + return $result; + } + } + + /** + * Update a Piwik site's detail information + * + * @param int $site_id + * which Piwik site to updated + * @param int $blog_id + * which blog's Piwik site ID to get, default is the current blog + */ + private function update_piwik_site( $site_id, $blog_id = null ) { + $is_current = ! self::$settings->check_network_activation() || empty( $blog_id ); + $id = WP_Piwik\Request::register( + 'SitesManager.updateSite', + array( + 'idSite' => $site_id, + 'urls' => $is_current ? get_bloginfo( 'url' ) : get_blog_details( $blog_id )->siteurl, + 'siteName' => $is_current ? get_bloginfo( 'name' ) : get_blog_details( $blog_id )->blogname, + ) + ); + $this->request( $id ); + self::$logger->log( 'Update Matomo site: WordPress site ' . ( $is_current ? get_bloginfo( 'url' ) : get_blog_details( $blog_id )->siteurl ) ); + } + + /** + * Update a site's tracking code + * + * @param int|false $site_id + * which Piwik site to updated + * @param int|null $blog_id + * which blog's Piwik site ID to get, default is the current blog + * @return string|false tracking code + */ + public function update_tracking_code( $site_id = false, $blog_id = null ) { + if ( ! $site_id ) { + $site_id = $this->get_piwik_site_id(); + } + if ( 'disabled' === self::$settings->get_global_option( 'track_mode' ) || 'manually' === self::$settings->get_global_option( 'track_mode' ) ) { + return false; + } + $id = WP_Piwik\Request::register( + 'SitesManager.getJavascriptTag', + array( + 'idSite' => $site_id, + 'mergeSubdomains' => self::$settings->get_global_option( 'track_across' ) ? 1 : 0, + 'mergeAliasUrls' => self::$settings->get_global_option( 'track_across_alias' ) ? 1 : 0, + 'disableCookies' => self::$settings->get_global_option( 'disable_cookies' ) ? 1 : 0, + 'crossDomain' => self::$settings->get_global_option( 'track_crossdomain_linking' ) ? 1 : 0, + 'trackNoScript' => 1, + ) + ); + $code = $this->request( $id ); + if ( is_array( $code ) && isset( $code['value'] ) ) { + $code = $code['value']; + } + $result = ! is_array( $code ) ? html_entity_decode( $code ) : ''; + self::$logger->log( 'Delivered tracking code: ' . $result ); + $result = WP_Piwik\TrackingCode::prepare_tracking_code( $result, self::$settings, self::$logger ); + if ( isset( $result ['script'] ) && ! empty( $result ['script'] ) ) { + self::$settings->set_option( 'tracking_code', $result ['script'], $blog_id ); + self::$settings->set_option( 'noscript_code', $result ['noscript'], $blog_id ); + self::$settings->set_global_option( 'proxy_url', $result ['proxy'] ); + return $result['script']; + } + return false; + } + + /** + * Update Piwik site if blog name changes + */ + public function on_blog_name_change() { + $this->update_piwik_site( self::$settings->get_option( 'site_id' ) ); + } + + /** + * Update Piwik site if blog URL changes + */ + public function on_site_url_change() { + $this->update_piwik_site( self::$settings->get_option( 'site_id' ) ); + } + + /** + * Register stats page meta boxes + */ + public function onload_stats_page() { + if ( self::$settings->get_global_option( 'disable_timelimit' ) ) { + set_time_limit( 0 ); + } + wp_enqueue_script( 'common' ); + wp_enqueue_script( 'wp-lists' ); + wp_enqueue_script( 'postbox' ); + wp_enqueue_script( 'wp-piwik', $this->get_plugin_url() . 'js/wp-piwik.js', array(), self::$version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', $this->get_plugin_url() . 'js/chartjs/chart.min.js', array(), self::$version, false ); + new \WP_Piwik\Widget\Chart( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Visitors( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Overview( $this, self::$settings, $this->stats_page_id ); + if ( self::$settings->get_global_option( 'stats_ecommerce' ) ) { + new \WP_Piwik\Widget\Ecommerce( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Items( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\ItemsCategory( $this, self::$settings, $this->stats_page_id ); + } + if ( self::$settings->get_global_option( 'stats_seo' ) ) { + new \WP_Piwik\Widget\Seo( $this, self::$settings, $this->stats_page_id ); + } + new \WP_Piwik\Widget\Pages( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Keywords( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Referrers( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Plugins( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Search( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Noresult( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Browsers( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\BrowserDetails( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Screens( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Types( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Models( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Systems( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\SystemDetails( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\City( $this, self::$settings, $this->stats_page_id ); + new \WP_Piwik\Widget\Country( $this, self::$settings, $this->stats_page_id ); + } + + /** + * Add per post statistics to a post's page + * @phpcs:disable WordPress.NamingConventions.ValidHookName.UseUnderscores + * @phpcs:disable WordPress.NamingConventions.ValidHookName.NonPrefixedHooknameFound + */ + public function onload_post_page() { + global $post; + $post_url = get_permalink( $post->ID ); + $this->log( 'Load per post statistics: ' . $post_url ); + $locations = apply_filters( 'wp-piwik_meta_boxes_locations', get_post_types( array( 'public' => true ), 'names' ) ); + array( + new Post( + $this, + self::$settings, + $locations, + 'side', + 'default', + array( + 'date' => self::$settings->get_global_option( 'perpost_stats' ), + 'period' => 'day', + 'url' => $post_url, + ) + ), + 'show', + ); + } + + /** + * Stats page changes by POST submit + * + * @see http://tinyurl.com/5r5vnzs + */ + public function on_stats_page_save_changes() { + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( esc_html__( 'Cheatin’ uh?', 'wp-piwik' ) ); + } + check_admin_referer( 'wp-piwik_stats' ); + if ( ! empty( $_POST['_wp_http_referer'] ) ) { + wp_safe_redirect( sanitize_url( wp_unslash( $_POST['_wp_http_referer'] ) ) ); + } + } + + /** + * Get option value, choose method depending on network mode + * + * @param string $option option key + * @return string|array|null $default_value option value + */ + private function get_word_press_option( $option, $default_value = null ) { + return ( $this->is_network_mode() ? get_site_option( $option, $default_value ) : get_option( $option, $default_value ) ); + } + + /** + * Delete option, choose method depending on network mode + * + * @param string $option option key + */ + private function delete_word_press_option( $option ) { + if ( $this->is_network_mode() ) { + delete_site_option( $option ); + } else { + delete_option( $option ); + } + } + + /** + * Set option value, choose method depending on network mode + * + * @param string $option option key + * @param mixed $value option value + */ + private function update_word_press_option( $option, $value ) { + if ( $this->is_network_mode() ) { + update_site_option( $option, $value ); + } else { + update_option( $option, $value ); + } + } + + /** + * Check if WP-Piwik options page + * + * @return boolean True if current page is WP-Piwik's option page + */ + public static function is_valid_options_post() { + return is_admin() && check_admin_referer( 'wp-piwik_settings' ) && current_user_can( 'manage_options' ); + } + + private function set_up_ai_bot_tracking() { + $ai_bot_tracking = new \WP_Piwik\AIBotTracking( self::$settings, self::$logger ); + $ai_bot_tracking->register_hooks(); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AIBotTracking.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AIBotTracking.php new file mode 100644 index 00000000..1daa919f --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AIBotTracking.php @@ -0,0 +1,234 @@ +` directive that + * loads the misc/track_ai_bot.php script. This technique will only work + * for CDNs that support ESI. + * + * The misc/track_ai_bot.php script uses this class without all of WordPress loaded. + * It can also be loaded outside of WordPress. Because of this, it is important + * that the script and this class use as few total dependencies as possible. Otherwise, + * AI bot tracking reduce the performance of requests to cached content. + */ +class AIBotTracking { + + private static $ai_bot_tracked = false; + + private static $extensions_to_track = array( + '', // no extension + + 'htm', + 'html', + 'php', + ); + + /** + * @var Settings + */ + private $settings; + + /** + * @var Logger + */ + private $logger; + + /** + * @var AjaxTracker|null + */ + private $tracker = null; + + /** + * @param Settings $settings + * @param Logger $logger + */ + public function __construct( Settings $settings, Logger $logger ) { + $this->settings = $settings; + $this->logger = $logger; + } + + public function register_hooks() { + add_action( 'litespeed_init', array( $this, 'litespeed_init' ) ); + add_action( 'wp_footer', array( $this, 'do_ai_bot_tracking' ), 999999 ); + } + + public function litespeed_init() { + if ( class_exists( ESI::class ) + && $this->settings->is_ai_bot_tracking_enabled_via_esi_includes() + ) { + ESI::set_has_esi(); + } + } + + /** + * @param string|null $url + * @return void + */ + public function do_ai_bot_tracking( $url = null ) { + // track AI bots only once per request + if ( self::$ai_bot_tracked ) { + return; + } + + self::$ai_bot_tracked = true; + + // if using ESI to track, and not within the track_ai_bot.php script, output the appropriate ESI tag + $is_using_esi_to_track = $this->settings->is_ai_bot_tracking_enabled_via_esi_includes(); + if ( + $is_using_esi_to_track + && empty( $GLOBALS['WP_PIWIK_IN_ESI'] ) + ) { + $track_script_url = plugins_url( '/misc/track_ai_bot.php', WP_PIWIK_FILE ) . '?mtm_esi=1&mtm_url=' . rawurlencode( AjaxTracker::getCurrentUrl() ); + echo ''; + return; + } + + if ( ! $this->is_doing_ai_bot_tracking_this_request() ) { + return; + } + + $response_code = http_response_code(); + $request_elapsed_ms = null; + + // cannot track request time if executed via an esi:include + if ( + empty( $GLOBALS['WP_PIWIK_IN_ESI'] ) + && array_key_exists( 'REQUEST_TIME_FLOAT', $_SERVER ) + ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash + $request_elapsed_ms = (int) ( ( microtime( true ) - floatval( $_SERVER['REQUEST_TIME_FLOAT'] ) ) * 1000 ); + } + + if ( empty( $response_code ) ) { + $response_code = 200; + } + + // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled + $source = 'WordPress'; + + if ( empty( $url ) ) { + $url = AjaxTracker::getCurrentUrl(); + } + + $tracker = $this->get_tracker(); + + $tracker->setUrl( $url ); + + // cannot count bytes echo'd so no response size tracked + $tracker->doTrackPageViewIfAIBot( $response_code, null, $request_elapsed_ms, $source ); + } + + public function should_track_current_page() { + if ( is_admin() ) { + return false; + } + + if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) { + return false; + } + + if ( wp_doing_ajax() ) { + return false; + } + + if ( empty( $_SERVER['REQUEST_URI'] ) ) { + return false; + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $request_path = (string) wp_parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ), PHP_URL_PATH ); + + if ( preg_match( '/matomo\.php$/', $request_path ) ) { + return false; + } + + if ( $this->is_request_for_file( $request_path ) ) { + return false; + } + + return true; + } + + private function is_request_for_file( $request_path ) { + if ( + ! empty( $_SERVER['DOCUMENT_ROOT'] ) + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + && is_dir( wp_unslash( $_SERVER['DOCUMENT_ROOT'] ) . $request_path ) + ) { + return false; + } + + $extension = pathinfo( $request_path, PATHINFO_EXTENSION ); + return ! in_array( $extension, self::$extensions_to_track, true ); + } + + public function is_js_execution_detected() { + return ! empty( $_COOKIE['matomo_has_js'] ) + && '1' === $_COOKIE['matomo_has_js']; + } + + private function is_doing_ai_bot_tracking_this_request() { + if ( ! empty( $GLOBALS['WP_PIWIK_IN_ESI'] ) ) { + return true; + } + + if ( ! $this->should_track_current_page() ) { + return false; + } + + if ( $this->is_js_execution_detected() ) { + return false; + } + + $tracker = $this->get_tracker(); + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + if ( ! AjaxTracker::isUserAgentAIBot( $tracker->userAgent ) ) { + return false; + } + + if ( + ! $this->settings->is_ai_bot_tracking_enabled() + || ! $this->settings->is_tracking_enabled() + ) { + return false; + } + + return true; + } + + private function get_tracker() { + if ( empty( $this->tracker ) ) { + $this->tracker = new AjaxTracker( $this->settings, $this->logger ); + $this->tracker->setRequestTimeout( 1 ); + } + + return $this->tracker; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin.php new file mode 100644 index 00000000..49b94011 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin.php @@ -0,0 +1,34 @@ +get_plugin_url() . 'css/wp-piwik.css', array(), self::$wp_piwik->get_plugin_version() ); + } + + public function on_load() { + // empty + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php new file mode 100644 index 00000000..0abf3ed4 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Network.php @@ -0,0 +1,16 @@ +get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + } + + public function on_load() { + self::$wp_piwik->onload_stats_page(); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php new file mode 100644 index 00000000..28edd961 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Admin/Settings.php @@ -0,0 +1,1301 @@ + + * phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery + * phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching + */ +class Settings extends \WP_Piwik\Admin { + + /** + * Builds and displays the settings page + */ + public function show() { + if ( ! empty( $_GET['sitebrowser'] ) ) { + new \WP_Piwik\Admin\Sitebrowser( self::$wp_piwik ); + return; + } + if ( ! empty( $_GET['clear'] ) && check_admin_referer() ) { + $this->clear( 2 === (int) $_GET['clear'] ); + self::$wp_piwik->reset_request(); + $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; + echo '
'; + return; + } elseif ( self::$wp_piwik->is_config_submitted() ) { + $this->show_box( 'updated', 'yes', esc_html__( 'Changes saved.', 'wp-piwik' ) ); + self::$wp_piwik->reset_request(); + if ( 'php' === self::$settings->get_global_option( 'piwik_mode' ) ) { + self::$wp_piwik->define_piwik_constants(); + } + if ( self::$settings->get_global_option( 'auto_site_config' ) && self::$wp_piwik->is_configured() ) { + $site_id = self::$wp_piwik->get_piwik_site_id( null, true ); + self::$wp_piwik->update_tracking_code( $site_id ); + self::$settings->set_option( 'site_id', $site_id ); + } else { + self::$wp_piwik->update_tracking_code(); + } + } + global $wp_roles; + ?> +
+ get_headline( 1, 'admin-generic', 'Settings', true ); + if ( ! empty( $_GET['testscript'] ) ) { + $this->run_testscript(); + } + ?> + is_configured() ) { + $piwik_version = self::$wp_piwik->request( 'global.getPiwikVersion' ); + if ( is_array( $piwik_version ) && isset( $piwik_version['value'] ) ) { + $piwik_version = $piwik_version['value']; + } + } + $page = sanitize_key( wp_unslash( $_GET['page'] ) ); + ?> +
+ + + + + '; + printf( '', esc_html__( 'Thanks for using WP-Matomo!', 'wp-piwik' ) ); + if ( self::$wp_piwik->is_configured() ) { + if ( ! empty( $piwik_version ) && ! is_array( $piwik_version ) ) { + $this->show_text( sprintf( __( 'WP-Matomo %1$s is successfully connected to Matomo %2$s.', 'wp-piwik' ), self::$wp_piwik->get_plugin_version(), $piwik_version ) . ' ' . ( ! self::$wp_piwik->is_network_mode() ? sprintf( __( 'You are running WordPress %s.', 'wp-piwik' ), get_bloginfo( 'version' ) ) : sprintf( __( 'You are running a WordPress %s blog network (WPMU). WP-Matomo will handle your sites as different websites.', 'wp-piwik' ), get_bloginfo( 'version' ) ) ) ); + } else { + $error_message = \WP_Piwik\Request::get_last_error(); + if ( empty( $error_message ) ) { + $this->show_box( 'error', 'no', esc_html( sprintf( __( 'WP-Matomo %s was not able to connect to Matomo using your configuration. Check the »Connect to Matomo« section below.', 'wp-piwik' ), self::$wp_piwik->get_plugin_version() ) ) ); + } else { + $this->show_box( 'error', 'no', esc_html( sprintf( __( 'WP-Matomo %1$s was not able to connect to Matomo using your configuration. During connection the following error occured: ', 'wp-piwik' ), self::$wp_piwik->get_plugin_version() ) ) . '
' . esc_html( $error_message ) . '' ); + } + } + } else { + $this->show_box( 'error', 'no', esc_html( sprintf( __( 'WP-Matomo %s has to be connected to Matomo first. Check the »Connect to Matomo« section below.', 'wp-piwik' ), self::$wp_piwik->get_plugin_version() ) ) ); + } + + $tabs ['connect'] = array( + 'icon' => 'admin-plugins', + 'name' => __( 'Connect to Matomo', 'wp-piwik' ), + ); + if ( self::$wp_piwik->is_configured() ) { + $tabs ['statistics'] = array( + 'icon' => 'chart-pie', + 'name' => __( 'Show Statistics', 'wp-piwik' ), + ); + $tabs ['tracking'] = array( + 'icon' => 'location-alt', + 'name' => __( 'Enable Tracking', 'wp-piwik' ), + ); + } + $tabs ['expert'] = array( + 'icon' => 'shield', + 'name' => __( 'Expert Settings', 'wp-piwik' ), + ); + $tabs ['support'] = array( + 'icon' => 'lightbulb', + 'name' => __( 'Support', 'wp-piwik' ), + ); + $tabs ['credits'] = array( + 'icon' => 'groups', + 'name' => __( 'Credits', 'wp-piwik' ), + ); + + echo '

%s
'; + + if ( ! self::$wp_piwik->is_configured() ) { + $this->show_box( 'updated', 'info', esc_html__( 'Before you can complete the setup, make sure you have a Matomo instance running. If you don\'t have one, you can', 'wp-piwik' ) . ' ' . esc_html__( 'create a free account', 'wp-piwik' ) . ' ' . esc_html__( 'or ', 'wp-piwik' ) . '' . esc_html__( 'install the "Matomo for WordPress" plugin', 'wp-piwik' ) . ' ' . esc_html__( 'instead.', 'wp-piwik' ) ); + } + + if ( ! function_exists( 'curl_init' ) && ! ini_get( 'allow_url_fopen' ) ) { + $this->show_box( 'error', 'no', esc_html__( 'Neither cURL nor fopen are available. So WP-Matomo can not use the HTTP API and not connect to InnoCraft Cloud.', 'wp-piwik' ) . ' ' . sprintf( '%s.', 'https://wordpress.org/plugins/wp-piwik/faq/', esc_html__( 'More information', 'wp-piwik' ) ) ); + } + + $description = sprintf( '%s
%s: %s
%s: %s
%s: %s', esc_html__( 'You can choose between three connection methods:', 'wp-piwik' ), esc_html__( 'Self-hosted (HTTP API, default)', 'wp-piwik' ), esc_html__( 'This is the default option for a self-hosted Matomo and should work for most configurations. WP-Matomo will connect to Matomo using http(s).', 'wp-piwik' ), esc_html__( 'Self-hosted (PHP API)', 'wp-piwik' ), esc_html__( 'Choose this, if your self-hosted Matomo and WordPress are running on the same machine and you know the full server path to your Matomo instance.', 'wp-piwik' ), esc_html__( 'Cloud-hosted', 'wp-piwik' ), esc_html__( 'If you are using a cloud-hosted Matomo by InnoCraft, you can simply use this option. Be carefull to choose the option which fits to your cloud domain (matomo.cloud or innocraft.cloud).', 'wp-piwik' ) ); + $this->show_select( + 'piwik_mode', + __( 'Matomo Mode', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled (WP-Matomo will not connect to Matomo)', 'wp-piwik' ), + 'http' => __( 'Self-hosted (HTTP API, default)', 'wp-piwik' ), + 'php' => __( 'Self-hosted (PHP API)', 'wp-piwik' ), + 'cloud-matomo' => __( 'Cloud-hosted (Innocraft Cloud, *.matomo.cloud)', 'wp-piwik' ), + 'cloud' => __( 'Cloud-hosted (InnoCraft Cloud, *.innocraft.cloud)', 'wp-piwik' ), + ), + $description, + 'jQuery(\'tr.wp-piwik-mode-option\').addClass(\'hidden\'); jQuery(\'.wp-piwik-mode-option-\' + jQuery(\'#piwik_mode\').val()).removeClass(\'hidden\');', + false, + '', + self::$wp_piwik->is_configured() + ); + + $this->show_input( 'piwik_url', __( 'Matomo URL', 'wp-piwik' ), __( 'Enter your Matomo URL. This is the same URL you use to access your Matomo instance, e.g. http://www.example.com/matomo/.', 'wp-piwik' ), 'http' !== self::$settings->get_global_option( 'piwik_mode' ), 'wp-piwik-mode-option', 'http', self::$wp_piwik->is_configured(), true ); + $this->show_input( 'piwik_path', __( 'Matomo path', 'wp-piwik' ), __( 'Enter the file path to your Matomo instance, e.g. /var/www/matomo/.', 'wp-piwik' ), 'php' !== self::$settings->get_global_option( 'piwik_mode' ), 'wp-piwik-mode-option', 'php', self::$wp_piwik->is_configured(), true ); + $this->show_input( 'piwik_user', __( 'Innocraft subdomain', 'wp-piwik' ), __( 'Enter your InnoCraft Cloud subdomain. It is also part of your URL: https://SUBDOMAIN.innocraft.cloud.', 'wp-piwik' ), 'cloud' !== self::$settings->get_global_option( 'piwik_mode' ), 'wp-piwik-mode-option', 'cloud', self::$wp_piwik->is_configured() ); + $this->show_input( 'matomo_user', __( 'Matomo subdomain', 'wp-piwik' ), __( 'Enter your Matomo Cloud subdomain. It is also part of your URL: https://SUBDOMAIN.matomo.cloud.', 'wp-piwik' ), 'cloud-matomo' !== self::$settings->get_global_option( 'piwik_mode' ), 'wp-piwik-mode-option', 'cloud-matomo', self::$wp_piwik->is_configured() ); + $this->show_input( 'piwik_token', __( 'Auth token', 'wp-piwik' ), __( 'Enter your Matomo auth token here. It is an alphanumerical code like 0a1b2c34d56e78901fa2bc3d45678efa.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sWP-Matomo FAQ%2$s.', 'wp-piwik' ), '', '' ), false, '', '', self::$wp_piwik->is_configured(), true, 'password' ); + + // Site configuration + $piwik_site_id = self::$wp_piwik->is_configured() ? self::$wp_piwik->get_piwik_site_id() : false; + if ( ! self::$wp_piwik->is_network_mode() ) { + $this->show_checkbox( + 'auto_site_config', + __( 'Auto config', 'wp-piwik' ), + __( 'Check this to automatically choose your blog from your Matomo sites by URL. If your blog is not added to Matomo yet, WP-Matomo will add a new site.', 'wp-piwik' ), + false, + '', + false, + 'jQuery(\'tr.wp-piwik-auto-option\').toggle(\'hidden\');' . ( $piwik_site_id ? 'jQuery(\'#site_id\').val(' . $piwik_site_id . ');' : '' ) + ); + if ( self::$wp_piwik->is_configured() ) { + $piwik_site_list = self::$wp_piwik->get_piwik_site_details(); + if ( isset( $piwik_site_list['result'] ) && 'error' === $piwik_site_list['result'] ) { + $this->show_box( + 'error', + 'no', + esc_html( sprintf( __( 'WP-Matomo %1$s was not able to get sites with at least view access: ', 'wp-piwik' ), self::$wp_piwik->get_plugin_version() ) ) . '
' . esc_html( $piwik_site_list['message'] ) . '' + ); + } else { + if ( is_array( $piwik_site_list ) ) { + foreach ( $piwik_site_list as $details ) { + $piwik_site_details[ $details['idsite'] ] = $details; + } + } + unset( $piwik_site_list ); + if ( 'n/a' !== $piwik_site_id && isset( $piwik_site_details ) ) { + $piwik_site_description = $piwik_site_details [ $piwik_site_id ] ['name'] . ' (' . $piwik_site_details [ $piwik_site_id ] ['main_url'] . ')'; + } else { + $piwik_site_description = 'n/a'; + } + echo ''; + if ( isset( $piwik_site_details ) ) { + foreach ( $piwik_site_details as $key => $site_data ) { + $site_list[ $site_data['idsite'] ] = $site_data['name'] . ' (' . $site_data ['main_url'] . ')'; + } + } + if ( isset( $site_list ) ) { + $this->show_select( + 'site_id', + __( 'Select site', 'wp-piwik' ), + $site_list, + __( 'Choose the Matomo site corresponding to this blog.', 'wp-piwik' ), + '', + (int) self::$settings->get_global_option( 'auto_site_config' ) === 1, + 'wp-piwik-auto-option', + true, + false + ); + } + } + } + } else { + echo ''; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $submit_button; + + echo '
' . esc_html__( 'Determined site', 'wp-piwik' ) . ':' . esc_html( $piwik_site_description ) . '
'; + // Stats configuration + $this->show_select( + 'default_date', + __( 'Matomo default date', 'wp-piwik' ), + array( + 'today' => __( 'Today', 'wp-piwik' ), + 'yesterday' => __( 'Yesterday', 'wp-piwik' ), + 'current_month' => __( 'Current month', 'wp-piwik' ), + 'last_month' => __( 'Last month', 'wp-piwik' ), + 'current_week' => __( 'Current week', 'wp-piwik' ), + 'last_week' => __( 'Last week', 'wp-piwik' ), + ), + __( 'Default date shown on statistics page.', 'wp-piwik' ) + ); + + $this->show_checkbox( 'stats_seo', __( 'Show SEO data', 'wp-piwik' ), __( 'Display SEO ranking data on statistics page.', 'wp-piwik' ) . ' (' . __( 'Slow!', 'wp-piwik' ) . ')' ); + $this->show_checkbox( 'stats_ecommerce', __( 'Show e-commerce data', 'wp-piwik' ), __( 'Display e-commerce data on statistics page.', 'wp-piwik' ) ); + + $this->show_select( + 'dashboard_widget', + __( 'Dashboard overview', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled', 'wp-piwik' ), + 'yesterday' => __( 'Yesterday', 'wp-piwik' ), + 'today' => __( 'Today', 'wp-piwik' ), + 'last30' => __( 'Last 30 days', 'wp-piwik' ), + 'last60' => __( 'Last 60 days', 'wp-piwik' ), + 'last90' => __( 'Last 90 days', 'wp-piwik' ), + ), + __( 'Enable WP-Matomo dashboard widget "Overview".', 'wp-piwik' ) + ); + + $this->show_checkbox( 'dashboard_chart', __( 'Dashboard graph', 'wp-piwik' ), __( 'Enable WP-Matomo dashboard widget "Graph".', 'wp-piwik' ) ); + + $this->show_checkbox( 'dashboard_seo', __( 'Dashboard SEO', 'wp-piwik' ), __( 'Enable WP-Matomo dashboard widget "SEO".', 'wp-piwik' ) . ' (' . __( 'Slow!', 'wp-piwik' ) . ')' ); + + $this->show_checkbox( 'dashboard_ecommerce', __( 'Dashboard e-commerce', 'wp-piwik' ), __( 'Enable WP-Matomo dashboard widget "E-commerce".', 'wp-piwik' ) ); + + $this->show_checkbox( 'toolbar', __( 'Show graph on WordPress Toolbar', 'wp-piwik' ), __( 'Display a last 30 days visitor graph on WordPress\' toolbar.', 'wp-piwik' ) ); + + echo ''; + + $this->show_select( + 'perpost_stats', + __( 'Show per post stats', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled', 'wp-piwik' ), + 'yesterday' => __( 'Yesterday', 'wp-piwik' ), + 'today' => __( 'Today', 'wp-piwik' ), + 'last30' => __( 'Last 30 days', 'wp-piwik' ), + 'last60' => __( 'Last 60 days', 'wp-piwik' ), + 'last90' => __( 'Last 90 days', 'wp-piwik' ), + ), + __( 'Show stats about single posts at the post edit admin page.', 'wp-piwik' ) + ); + + $this->show_checkbox( 'piwik_shortcut', __( 'Matomo shortcut', 'wp-piwik' ), __( 'Display a shortcut to Matomo itself.', 'wp-piwik' ) ); + + $this->show_input( 'plugin_display_name', __( 'WP-Matomo display name', 'wp-piwik' ), __( 'Plugin name shown in WordPress.', 'wp-piwik' ) ); + + $this->show_checkbox( 'shortcodes', __( 'Enable shortcodes', 'wp-piwik' ), __( 'Enable shortcodes in post or page content.', 'wp-piwik' ) ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $submit_button; + + echo ''; + + // Tracking Configuration + $is_not_tracking = 'disabled' === self::$settings->get_global_option( 'track_mode' ); + $is_not_generated_tracking = $is_not_tracking || 'manually' === self::$settings->get_global_option( 'track_mode' ); + $full_generated_tracking_group = 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-proxy'; + + $description = sprintf( + '%s
%s: %s
%s: %s
%s: %s
%s: %s
%s: %s', + esc_html__( 'You can choose between four tracking code modes:', 'wp-piwik' ), + esc_html__( 'Disabled', 'wp-piwik' ), + esc_html__( 'WP-Matomo will not add the tracking code. Use this, if you want to add the tracking code to your template files or you use another plugin to add the tracking code.', 'wp-piwik' ), + esc_html__( 'Default tracking', 'wp-piwik' ), + esc_html__( 'WP-Matomo will use Matomo\'s standard tracking code.', 'wp-piwik' ), + esc_html__( 'Use js/index.php', 'wp-piwik' ), + esc_html__( 'You can choose this tracking code, to deliver a minified proxy code and to avoid using the files called piwik.js or piwik.php.', 'wp-piwik' ) + . ' ' + . sprintf( esc_html__( 'See %1$sreadme file%2$s.', 'wp-piwik' ), '', '' ), + esc_html__( 'Use proxy script', 'wp-piwik' ), + esc_html__( 'Use this tracking code to not reveal the Matomo server URL.', 'wp-piwik' ) + . ' ' + . sprintf( esc_html__( 'See %1$sMatomo FAQ%2$s.', 'wp-piwik' ), '', '' ), + esc_html__( 'Enter manually', 'wp-piwik' ), + esc_html__( 'Enter your own tracking code manually. You can choose one of the prior options, pre-configure your tracking code and switch to manually editing at last.', 'wp-piwik' ) + . ( self::$wp_piwik->is_network_mode() ? ' ' . esc_html__( 'Use the placeholder {ID} to add the Matomo site ID.', 'wp-piwik' ) : '' ) + ); + $this->show_select( + 'track_mode', + __( 'Add tracking code', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled', 'wp-piwik' ), + 'default' => __( 'Default tracking', 'wp-piwik' ), + 'js' => __( 'Use js/index.php', 'wp-piwik' ), + 'proxy' => __( 'Use proxy script', 'wp-piwik' ), + 'manually' => __( 'Enter manually', 'wp-piwik' ), + ), + $description, + 'jQuery(\'tr.wp-piwik-track-option\').addClass(\'hidden\'); jQuery(\'tr.wp-piwik-track-option-\' + jQuery(\'#track_mode\').val()).removeClass(\'hidden\'); jQuery(\'#tracking_code, #noscript_code\').prop(\'readonly\', jQuery(\'#track_mode\').val() != \'manually\');' + ); + + $this->show_textarea( + 'tracking_code', + __( 'Tracking code', 'wp-piwik' ), + 15, + esc_html__( 'This is a preview of your current tracking code. If you choose to enter your tracking code manually, you can change it here.', 'wp-piwik' ), + $is_not_tracking, + 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-proxy wp-piwik-track-option-manually', + true, + '', + 'manually' !== self::$settings->get_global_option( 'track_mode' ), + false + ); + + $this->show_select( + 'track_codeposition', + __( 'JavaScript code position', 'wp-piwik' ), + array( + 'footer' => __( 'Footer', 'wp-piwik' ), + 'header' => __( 'Header', 'wp-piwik' ), + ), + __( 'Choose whether the JavaScript code is added to the footer or the header.', 'wp-piwik' ), + '', + $is_not_tracking, + 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-proxy wp-piwik-track-option-manually' + ); + + $this->show_textarea( + 'noscript_code', + __( 'Noscript code', 'wp-piwik' ), + 2, + esc_html__( 'This is a preview of your <noscript> code which is part of your tracking code.', 'wp-piwik' ), + 'proxy' === self::$settings->get_global_option( 'track_mode' ), + 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually', + true, + '', + 'manually' !== self::$settings->get_global_option( 'track_mode' ), + false + ); + + $this->show_checkbox( 'track_noscript', __( 'Add <noscript>', 'wp-piwik' ), __( 'Adds the <noscript> code to your footer.', 'wp-piwik' ) . ' ' . __( 'Disabled in proxy mode.', 'wp-piwik' ), 'proxy' === self::$settings->get_global_option( 'track_mode' ), 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually' ); + + $this->show_checkbox( 'track_nojavascript', __( 'Add rec parameter to noscript code', 'wp-piwik' ), __( 'Enable tracking for visitors without JavaScript (not recommended).', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo FAQ%2$s.', 'wp-piwik' ), '', '' ) . ' ' . __( 'Disabled in proxy mode.', 'wp-piwik' ), 'proxy' === self::$settings->get_global_option( 'track_mode' ), 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually' ); + + $this->show_select( + 'track_content', + __( 'Enable content tracking', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled', 'wp-piwik' ), + 'all' => __( 'Track all content blocks', 'wp-piwik' ), + 'visible' => __( 'Track only visible content blocks', 'wp-piwik' ), + ), + esc_html__( 'Content tracking allows you to track interaction with the content of a web page or application.', 'wp-piwik' ) . ' ' . sprintf( esc_html__( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ), + '', + $is_not_tracking, + $full_generated_tracking_group . ' wp-piwik-track-option-manually' + ); + + $this->show_checkbox( 'track_search', __( 'Track search', 'wp-piwik' ), __( 'Use Matomo\'s advanced Site Search Analytics feature.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ), $is_not_tracking, $full_generated_tracking_group . ' wp-piwik-track-option-manually' ); + + $this->show_checkbox( 'track_404', __( 'Track 404', 'wp-piwik' ), __( 'WP-Matomo can automatically add a 404-category to track 404-page-visits.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo FAQ%2$s.', 'wp-piwik' ), '', '' ), $is_not_tracking, $full_generated_tracking_group . ' wp-piwik-track-option-manually' ); + + echo ''; + echo ''; + + $this->show_checkbox( 'add_customvars_box', __( 'Show custom variables box', 'wp-piwik' ), __( ' Show a "custom variables" edit box on post edit page.', 'wp-piwik' ) . ' ' . sprintf( esc_html__( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ), $is_not_generated_tracking, $full_generated_tracking_group . ' wp-piwik-track-option-manually' ); + + $this->show_input( 'add_download_extensions', __( 'Add new file types for download tracking', 'wp-piwik' ), __( 'Add file extensions for download tracking, divided by a vertical bar (|).', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ), $is_not_generated_tracking, $full_generated_tracking_group ); + + $this->show_select( + 'require_consent', + __( 'Tracking or cookie consent', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled', 'wp-piwik' ), + 'consent' => __( 'Require consent', 'wp-piwik' ), + 'cookieconsent' => __( 'Require cookie consent', 'wp-piwik' ), + ), + esc_html__( 'Enable support for consent managers.', 'wp-piwik' ) . ' ' . sprintf( esc_html__( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ), + '', + $is_not_generated_tracking, + $full_generated_tracking_group + ); + + $this->show_checkbox( 'disable_cookies', __( 'Disable cookies', 'wp-piwik' ), __( 'Disable all tracking cookies for a visitor.', 'wp-piwik' ), $is_not_generated_tracking, $full_generated_tracking_group ); + + $this->show_checkbox( 'limit_cookies', __( 'Limit cookie lifetime', 'wp-piwik' ), __( 'You can limit the cookie lifetime to avoid tracking your users over a longer period as necessary.', 'wp-piwik' ), $is_not_generated_tracking, $full_generated_tracking_group, true, 'jQuery(\'tr.wp-piwik-cookielifetime-option\').toggleClass(\'wp-piwik-hidden\');' ); + + $this->show_input( 'limit_cookies_visitor', __( 'Visitor timeout (seconds)', 'wp-piwik' ), false, $is_not_generated_tracking || ! self::$settings->get_global_option( 'limit_cookies' ), $full_generated_tracking_group . ' wp-piwik-cookielifetime-option' . ( self::$settings->get_global_option( 'limit_cookies' ) ? '' : ' wp-piwik-hidden' ) ); + + $this->show_input( 'limit_cookies_session', __( 'Session timeout (seconds)', 'wp-piwik' ), false, $is_not_generated_tracking || ! self::$settings->get_global_option( 'limit_cookies' ), $full_generated_tracking_group . ' wp-piwik-cookielifetime-option' . ( self::$settings->get_global_option( 'limit_cookies' ) ? '' : ' wp-piwik-hidden' ) ); + + $this->show_input( 'limit_cookies_referral', __( 'Referral timeout (seconds)', 'wp-piwik' ), false, $is_not_generated_tracking || ! self::$settings->get_global_option( 'limit_cookies' ), $full_generated_tracking_group . ' wp-piwik-cookielifetime-option' . ( self::$settings->get_global_option( 'limit_cookies' ) ? '' : ' wp-piwik-hidden' ) ); + + $this->show_checkbox( 'track_admin', __( 'Track admin pages', 'wp-piwik' ), __( 'Enable to track users on admin pages (remember to configure the tracking filter appropriately).', 'wp-piwik' ), $is_not_tracking, $full_generated_tracking_group . ' wp-piwik-track-option-manually' ); + + echo ''; + echo ''; + + $this->show_checkbox( 'track_across', __( 'Track subdomains in the same website', 'wp-piwik' ), __( 'Adds *.-prefix to cookie domain.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ), $is_not_generated_tracking, $full_generated_tracking_group ); + + $this->show_checkbox( 'track_across_alias', __( 'Do not count subdomains as outlink', 'wp-piwik' ), __( 'Adds *.-prefix to tracked domain.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ), $is_not_generated_tracking, $full_generated_tracking_group ); + + $this->show_checkbox( 'track_crossdomain_linking', __( 'Enable cross domain linking', 'wp-piwik' ), __( 'When enabled, it will make sure to use the same visitor ID for the same visitor across several domains. This works only when this feature is enabled because the visitor ID is stored in a cookie and cannot be read on the other domain by default. When this feature is enabled, it will append a URL parameter "pk_vid" that contains the visitor ID when a user clicks on a URL that belongs to one of your domains. For this feature to work, you also have to configure which domains should be treated as local in your Matomo website settings. This feature requires Matomo 3.0.2.', 'wp-piwik' ), 'proxy' === self::$settings->get_global_option( 'track_mode' ), 'wp-piwik-track-option wp-piwik-track-option-default wp-piwik-track-option-js wp-piwik-track-option-manually' ); + + $this->show_checkbox( 'track_feed', __( 'Track RSS feeds', 'wp-piwik' ), __( 'Enable to track posts in feeds via tracking pixel.', 'wp-piwik' ), $is_not_tracking, $full_generated_tracking_group . ' wp-piwik-track-option-manually' ); + + $this->show_checkbox( + 'track_feed_addcampaign', + __( 'Track RSS feed links as campaign', 'wp-piwik' ), + esc_html__( 'This will add Matomo campaign parameters to the RSS feed links.', 'wp-piwik' ) + . ' ' + . sprintf( + __( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), + '', + '' + ), + $is_not_tracking, + $full_generated_tracking_group . ' wp-piwik-track-option-manually', + true, + 'jQuery(\'tr.wp-piwik-feed_campaign-option\').toggle(\'hidden\');' + ); + + $this->show_input( 'track_feed_campaign', __( 'RSS feed campaign', 'wp-piwik' ), __( 'Keyword: post name.', 'wp-piwik' ), $is_not_generated_tracking || ! self::$settings->get_global_option( 'track_feed_addcampaign' ), $full_generated_tracking_group . ' wp-piwik-feed_campaign-option' ); + + $this->show_input( 'track_heartbeat', __( 'Enable heartbeat timer', 'wp-piwik' ), __( 'Enable a heartbeat timer to get more accurate visit lengths by sending periodical HTTP ping requests as long as the site is opened. Enter the time between the pings in seconds (Matomo default: 15) to enable or 0 to disable this feature. Note: This will cause a lot of additional HTTP requests on your site.', 'wp-piwik' ), $is_not_generated_tracking, $full_generated_tracking_group ); + + $this->show_select( + 'track_user_id', + __( 'User ID Tracking', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled', 'wp-piwik' ), + 'uid' => __( 'WP User ID', 'wp-piwik' ), + 'email' => __( 'Email Address', 'wp-piwik' ), + 'username' => __( 'Username', 'wp-piwik' ), + 'displayname' => __( 'Display Name (Not Recommended!)', 'wp-piwik' ), + ), + __( 'When a user is logged in to WordPress, track their "User ID". You can select which field from the User\'s profile is tracked as the "User ID". When enabled, Tracking based on Email Address is recommended.', 'wp-piwik' ), + '', + $is_not_tracking, + $full_generated_tracking_group + ); + + ?> + + + + show_checkbox( + \WP_Piwik\Settings::TRACK_AI_BOTS, + esc_html__( 'Track AI Bots', 'wp-piwik' ), + esc_html__( 'If enabled, AI bots will trigger page views even if they do not execute JavaScript. These page views can be seen in the special AI Assistants report.', 'wp-piwik' ), + $is_not_tracking, + $full_generated_tracking_group . ' wp-piwik-track-option-manually', + true, + "window.jQuery('.wp-matomo-track-ai-warning').toggle();" + ); + + $matomo_is_track_ai_enabled = self::$settings->is_ai_bot_tracking_enabled(); + $matomo_is_advanced_cache_used = self::is_advanced_cache_used(); + $matomo_is_track_script_used_in_wp_config = self::is_track_script_used_in_wp_config(); + $matomo_is_htaccess_serving_cache_files = self::is_htaccess_serving_cache_files(); + + if ( $matomo_is_htaccess_serving_cache_files ) { + ?> + + + + + + + + show_checkbox( + \WP_Piwik\Settings::TRACK_AI_BOTS_USING_ESI, + esc_html__( 'Track AI Bots using Edge Side Includes', 'wp-piwik' ), + esc_html__( 'If you are using a CDN to serve your blog, you will not be able to track AI bots in the traditional method. If your CDN supports ESI (Edge Side Includes), however, you can enable this option to use this feature for tracking AI bots.', 'wp-piwik' ), + $is_not_tracking, + $full_generated_tracking_group . ' wp-piwik-track-option-manually' + ); + + $matomo_is_track_via_esi_enabled = self::$settings->is_track_via_esi_enabled(); + $matomo_is_using_litespeed = $this->is_using_litespeed_web_server(); + $matomo_is_using_litespeed_cache = $this->is_using_litespeed_cache_plugin(); + $matomo_is_esi_enabled_in_litespeed = $this->is_litespeed_esi_enabled_in_webserver(); + + if ( $matomo_is_using_litespeed && $matomo_is_using_litespeed_cache ) { + if ( ! $matomo_is_track_via_esi_enabled ) { + ?> + + + + + + + + '; + + $this->show_text( __( 'Usually, you do not need to change these settings. If you want to do so, you should know what you do or you got an expert\'s advice.', 'wp-piwik' ) ); + + $this->show_checkbox( 'cache', __( 'Enable cache', 'wp-piwik' ), __( 'Cache API calls, which not contain today\'s values, for a week.', 'wp-piwik' ) ); + + if ( function_exists( 'curl_init' ) && ini_get( 'allow_url_fopen' ) ) { + $this->show_select( + 'http_connection', + __( 'HTTP connection via', 'wp-piwik' ), + array( + 'curl' => __( 'cURL', 'wp-piwik' ), + 'fopen' => __( 'fopen', 'wp-piwik' ), + ), + __( 'Choose whether WP-Matomo should use cURL or fopen to connect to Matomo in HTTP or Cloud mode.', 'wp-piwik' ) + ); + } + + $this->show_select( + 'http_method', + __( 'HTTP method', 'wp-piwik' ), + array( + 'post' => __( 'POST', 'wp-piwik' ), + 'get' => __( 'GET', 'wp-piwik' ), + ), + __( 'Choose whether WP-Matomo should use POST or GET in HTTP or Cloud mode.', 'wp-piwik' ) + ); + + $this->show_checkbox( 'disable_timelimit', __( 'Disable time limit', 'wp-piwik' ), __( 'Use set_time_limit(0) if stats page causes a time out.', 'wp-piwik' ) ); + + $this->show_input( 'filter_limit', __( 'Filter limit', 'wp-piwik' ), __( 'Use filter_limit if you need to get more than 100 results per page.', 'wp-piwik' ) ); + + $this->show_input( 'connection_timeout', __( 'Connection timeout', 'wp-piwik' ), 'Define a connection timeout for all HTTP requests done by WP-Matomo in seconds.' ); + + $this->show_checkbox( 'disable_ssl_verify', __( 'Disable SSL peer verification', 'wp-piwik' ), '(' . __( 'not recommended', 'wp-piwik' ) . ')' ); + $this->show_checkbox( 'disable_ssl_verify_host', __( 'Disable SSL host verification', 'wp-piwik' ), '(' . __( 'not recommended', 'wp-piwik' ) . ')' ); + + $this->show_select( + 'piwik_useragent', + __( 'User agent', 'wp-piwik' ), + array( + 'php' => __( 'Use the PHP default user agent', 'wp-piwik' ) . ( ini_get( 'user_agent' ) ? '(' . ini_get( 'user_agent' ) . ')' : ' (' . __( 'empty', 'wp-piwik' ) . ')' ), + 'own' => __( 'Define a specific user agent', 'wp-piwik' ), + ), + 'WP-Matomo can send the default user agent defined by your PHP settings or use a specific user agent below. The user agent is send by WP-Matomo if HTTP requests are performed.', + 'jQuery(\'tr.wp-piwik-useragent-option\').toggleClass(\'hidden\');' + ); + $this->show_input( 'piwik_useragent_string', __( 'Specific user agent', 'wp-piwik' ), 'Define a user agent description which is send by WP-Matomo if HTTP requests are performed.', 'own' !== self::$settings->get_global_option( 'piwik_useragent' ), 'wp-piwik-useragent-option' ); + + $this->show_checkbox( + 'dnsprefetch', + __( 'Enable DNS prefetch', 'wp-piwik' ), + esc_html__( 'Add a DNS prefetch tag.', 'wp-piwik' ) + . ' ' + . sprintf( + esc_html__( 'See %1$sMatomo Blog%2$s.', 'wp-piwik' ), + '', + '' + ) + ); + + $this->show_checkbox( + 'track_datacfasync', + __( 'Add data-cfasync=false', 'wp-piwik' ), + esc_html__( 'Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to ignore the script.', 'wp-piwik' ) + . ' ' + . sprintf( + esc_html__( 'See %1$sCloudFlare Knowledge Base%2$s.', 'wp-piwik' ), + '', + '' + ) + ); + + $this->show_input( 'track_cdnurl', __( 'CDN URL', 'wp-piwik' ) . ' http://', 'Enter URL if you want to load the tracking code via CDN.' ); + + $this->show_input( 'track_cdnurlssl', __( 'CDN URL (SSL)', 'wp-piwik' ) . ' https://', 'Enter URL if you want to load the tracking code via a separate SSL CDN.' ); + + $this->show_select( + 'force_protocol', + __( 'Force Matomo to use a specific protocol', 'wp-piwik' ), + array( + 'disabled' => __( 'Disabled (default)', 'wp-piwik' ), + 'http' => __( 'http', 'wp-piwik' ), + 'https' => __( 'https (SSL)', 'wp-piwik' ), + ), + __( 'Choose if you want to explicitly force Matomo to use HTTP or HTTPS. Does not work with a CDN URL.', 'wp-piwik' ) + ); + + $this->show_checkbox( 'remove_type_attribute', __( 'Remove type attribute', 'wp-piwik' ), __( 'Removes the type attribute from Matomo\'s tracking code script tag.', 'wp-piwik' ) ); + + $this->show_select( + 'update_notice', + __( 'Update notice', 'wp-piwik' ), + array( + 'enabled' => __( 'Show always if WP-Matomo is updated', 'wp-piwik' ), + 'script' => __( 'Show only if WP-Matomo is updated and settings were changed', 'wp-piwik' ), + 'disabled' => __( 'Disabled', 'wp-piwik' ), + ), + esc_html__( 'Choose if you want to get an update notice if WP-Matomo is updated.', 'wp-piwik' ) + ); + + $this->show_input( 'set_download_extensions', __( 'Define all file types for download tracking', 'wp-piwik' ), __( 'Replace Matomo\'s default file extensions for download tracking, divided by a vertical bar (|). Leave blank to keep Matomo\'s default settings.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo documentation%2$s.', 'wp-piwik' ), '', '' ) ); + + $this->show_input( 'set_download_classes', __( 'Set classes to be treated as downloads', 'wp-piwik' ), __( 'Set classes to be treated as downloads (in addition to piwik_download), divided by a vertical bar (|). Leave blank to keep Matomo\'s default settings.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo JavaScript Tracking Client reference%2$s.', 'wp-piwik' ), '', '' ) ); + + $this->show_input( 'set_link_classes', __( 'Set classes to be treated as outlinks', 'wp-piwik' ), __( 'Set classes to be treated as outlinks (in addition to piwik_link), divided by a vertical bar (|). Leave blank to keep Matomo\'s default settings.', 'wp-piwik' ) . ' ' . sprintf( __( 'See %1$sMatomo JavaScript Tracking Client reference%2$s.', 'wp-piwik' ), '', '' ) ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $submit_button; + ?> + + + + + + + + + + + + + +
+
+ show_input_wrapper( + $id, + $name, + $description, + $is_hidden, + $group_name, + $hide_description, + function () use ( $id, $on_change ) { + ?> + get_global_option( $id ) ? ' checked="checked"' : '' ); ?> onchange="jQuery().val(this.checked?1:0); + + " /> + + + + + + + + +

+ +

+ + + + show_input_wrapper( + $id, + $name, + $description, + $is_hidden, + $group_name, + $hide_description, + function () use ( $id, $on_change, $rows, $is_readonly, $is_global ) { + ?> + +

%s

', esc_html( $text ) ); + } + + /** + * Show an input option + * + * @param string $id option id + * @param string $name descriptive option name + * @param string|false $description option description + * @param boolean $is_hidden set to true to initially hide the option (default: false) + * @param string $group_name define a class name to access a group of option rows by javascript (default: empty) + * @param string|false $row_name define a class name to access the specific option row by javascript (default: empty) + * @param boolean $hide_description $hideDescription set to false to show description initially (default: true) + * @param boolean $wide Create a wide box (default: false) + */ + private function show_input( $id, $name, $description, $is_hidden = false, $group_name = '', $row_name = false, $hide_description = true, $wide = false, $type = false ) { + $this->show_input_wrapper( + $id, + $name, + $description, + $is_hidden, + $group_name, + $hide_description, + function () use ( $id, $type ) { + ?> + + descriptive name) + * @param string $description option description + * @param string $on_change javascript for onchange event (default: empty) + * @param boolean $is_hidden set to true to initially hide the option (default: false) + * @param string $group_name define a class name to access a group of option rows by javascript (default: empty) + * @param boolean $hide_description $hideDescription set to false to show description initially (default: true) + * @param boolean $is_global set to false if the textarea shows a site-specific option (default: true) + */ + private function show_select( $id, $name, $options = array(), $description = '', $on_change = '', $is_hidden = false, $group_name = '', $hide_description = true, $is_global = true ) { + $default = $is_global ? self::$settings->get_global_option( $id ) : self::$settings->get_option( $id ); + + $this->show_input_wrapper( + $id, + $name, + $description, + $is_hidden, + $group_name, + $hide_description, + function () use ( $id, $on_change, $options, $default ) { + ?> + +

%s

', esc_attr( $type ), esc_attr( $icon ), $content ); + } + + /** + * Show headline + * + * @param int $order headline order (h?-tag), set to 0 to avoid headline-tagging + * @param string $icon headline icon, see https://developer.wordpress.org/resource/dashicons/ + * @param string $headline headline text + * @param string|bool $add_plugin_name set to true to add the plugin name to the headline (default: false) + */ + private function show_headline( $order, $icon, $headline, $add_plugin_name = false ) { + $this->get_headline( $order, $icon, $headline, $add_plugin_name ); + } + + /** + * Get headline HTML + * + * @param int $order headline order (h?-tag), set to 0 to avoid headline-tagging + * @param string $icon headline icon, see https://developer.wordpress.org/resource/dashicons/ + * @param string $headline headline text + * @param bool $add_plugin_name set to true to add the plugin name to the headline (default: false) + */ + private function get_headline( $order, $icon, $headline, $add_plugin_name = false ) { + echo ( $order > 0 ? '' : '' ) + . sprintf( + ' %s%s', + esc_attr( $icon ), + esc_html( $add_plugin_name ? self::$settings->get_not_empty_global_option( 'plugin_display_name' ) . ' ' : '' ), + esc_html( $headline ) + ) + . ( $order > 0 ? '' : '' ); + } + + /** + * Register admin scripts + * + * @see \WP_Piwik\Admin::print_admin_scripts() + */ + public function print_admin_scripts() { + wp_enqueue_script( 'jquery' ); + } + + /** + * Extend admin header + * + * @see \WP_Piwik\Admin::extend_admin_header() + */ + public function extend_admin_header() { + } + + /** + * Show credits + */ + public function show_credits() { + ?> +

+

+ ', + '' + ); + ?> +

+

, !

+

+

+ ', + '' + ); + ?> +

+ +

+ +
+ +
+
    +
  • + -
  • +
  • + -
  • +
  • + -
  • +
  • + -
  • +
  • + -
  • +
  • + -
  • +
  • + -
  • +
+ + +

+

+ ', + '' + ); + ?> +

+
    +
  1. + ' . ( function_exists( 'curl_init' ) ? '' : esc_html__( 'not', 'wp-piwik' ) ) . ' '; + esc_html_e( 'available', 'wp-piwik' ); + ?> + .
  2. +
  3. + ' . ( ini_get( 'allow_url_fopen' ) ? '' : esc_html__( 'not', 'wp-piwik' ) ) . ' '; + esc_html_e( 'enabled', 'wp-piwik' ); + ?> + .
  4. +
  5. get_global_option( 'http_connection' ) ) || ( function_exists( 'curl_init' ) && ! ini_get( 'allow_url_fopen' ) ) ) ? esc_html__( 'cURL', 'wp-piwik' ) : esc_html__( 'fopen', 'wp-piwik' ) ) . ' (' . ( 'post' === self::$settings->get_global_option( 'http_method' ) ? esc_html__( 'POST', 'wp-piwik' ) : esc_html__( 'GET', 'wp-piwik' ) ) . ') ' . esc_html__( 'is used.', 'wp-piwik' ); ?>
  6. + get_global_option( 'piwik_mode' ) ) { + ?> +
  7. + ' . esc_html( self::$settings->get_global_option( 'proxy_url' ) ) . ''; + ?> +
  8. +
+

:

+
    + +
  1. +
  2. +
  3. +
  4. +
+

+ read_rss_feed( 'http://wordpress.org/support/rss/plugin/wp-piwik' ); + if ( ! empty( $support_threads ) ) { + echo '
    '; + foreach ( $support_threads as $support_thread ) { + echo '
  1. ' . esc_html( $support_thread['title'] ) . '
  2. '; + } + echo '
'; + } + } + + /** + * Read RSS feed + * + * @param string $feed + * feed URL + * @param int $cnt + * item limit + * @return array feed items array[](title, url) + * + */ + private function read_rss_feed( $feed, $cnt = 5 ) { + $result = array(); + if ( function_exists( 'simplexml_load_file' ) && ! empty( $feed ) ) { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + $xml = @simplexml_load_file( $feed ); + if ( ! $xml || ! isset( $xml->channel [0]->item ) ) { + return array( + array( + 'title' => 'Can\'t read RSS feed.', + 'url' => $xml, + ), + ); + } + foreach ( $xml->channel [0]->item as $item ) { + if ( 0 === $cnt-- ) { + break; + } + $result [] = array( + 'title' => $item->title [0], + 'url' => $item->link [0], + ); + } + } + return $result; + } + + /** + * Clear cache and reset settings + * + * @param boolean $clear_settings set to true to reset settings (default: false) + */ + private function clear( $clear_settings = false ) { + if ( $clear_settings ) { + self::$settings->reset_settings(); + $this->show_box( 'updated', 'yes', esc_html__( 'Settings cleared (except connection settings).', 'wp-piwik' ) ); + } + global $wpdb; + if ( self::$settings->check_network_activation() ) { + $ary_blogs = \WP_Piwik\Settings::get_blog_list(); + if ( is_array( $ary_blogs ) ) { + foreach ( $ary_blogs as $ary_blog ) { + switch_to_blog( $ary_blog['blog_id'] ); + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_wp-piwik_%'" ); + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_wp-piwik_%'" ); + restore_current_blog(); + } + } + } else { + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_wp-piwik_%'" ); + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_wp-piwik_%'" ); + } + $this->show_box( 'updated', 'yes', esc_html__( 'Cache cleared.', 'wp-piwik' ) ); + } + + /** + * Execute test script and display results + */ + private function run_testscript() { + ?> +
+

Testscript Result

+ is_configured() ) { + if ( ! empty( $_GET['testscript_id'] ) ) { + switch_to_blog( intval( wp_unslash( $_GET['testscript_id'] ) ) ); + } + ?> + + +

Please configure WP-Matomo first.

+ +
+ wp_piwik = $wp_piwik; + if ( isset( $_REQUEST['s'] ) ) { + $cnt = $this->prepare_items( sanitize_text_field( wp_unslash( $_REQUEST['s'] ) ) ); + } else { + $cnt = $this->prepare_items(); + } + $this->show_search_form(); + parent::__construct( + array( + 'singular' => __( 'site', 'wp-piwik' ), + 'plural' => __( 'sites', 'wp-piwik' ), + 'ajax' => false, + ) + ); + if ( $cnt > 0 ) { + $this->display(); + } else { + echo '

' . esc_html__( 'No site configured yet.', 'wp-piwik' ) . '

'; + } + } + + public function get_columns() { + $columns = array( + 'id' => __( 'Blog ID', 'wp-piwik' ), + 'name' => __( 'Title', 'wp-piwik' ), + 'siteurl' => __( 'URL', 'wp-piwik' ), + 'piwikid' => __( 'Site ID (Piwik)', 'wp-piwik' ), + ); + return $columns; + } + + public function prepare_items( $search = '' ) { + global $blog_id; + global $wpdb; + global $pagenow; + + $current_page = $this->get_pagenum(); + $per_page = 10; + + if ( is_plugin_active_for_network( 'wp-piwik/wp-piwik.php' ) ) { + $search = '%' . $wpdb->esc_like( $search ) . '%'; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $total_items = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->blogs} WHERE CONCAT(domain, path) LIKE %s AND spam = 0 AND deleted = 0", $search ) ); + $blogs = \WP_Piwik\Settings::get_blog_list( $per_page, $current_page, $search ); + foreach ( $blogs as $blog ) { + $blog_details = get_blog_details( $blog['blog_id'], true ); + $this->data [] = array( + 'name' => $blog_details->blogname, + 'id' => $blog_details->blog_id, + 'siteurl' => $blog_details->siteurl, + 'piwikid' => $this->wp_piwik->get_piwik_site_id( $blog_details->blog_id ), + ); + } + } else { + $blog_details = get_bloginfo(); + $this->data [] = array( + 'name' => get_bloginfo( 'name' ), + 'id' => '-', + 'siteurl' => get_bloginfo( 'url' ), + 'piwikid' => $this->wp_piwik->get_piwik_site_id(), + ); + $total_items = 1; + } + $columns = $this->get_columns(); + $hidden = array(); + $sortable = array(); + $this->_column_headers = array( + $columns, + $hidden, + $sortable, + ); + $this->set_pagination_args( + array( + 'total_items' => $total_items, + 'per_page' => $per_page, + ) + ); + foreach ( $this->data as $key => $dataset ) { + if ( empty( $dataset['piwikid'] ) || 'n/a' === $dataset['piwikid'] ) { + $this->data [ $key ] ['piwikid'] = __( 'Site not created yet.', 'wp-piwik' ); + } + if ( $this->wp_piwik->is_network_mode() ) { + $this->data [ $key ] ['name'] = '' . esc_html( $dataset['name'] ) . ''; + } + } + $this->items = $this->data; + return count( $this->items ); + } + + public function column_default( $item, $column_name ) { + switch ( $column_name ) { + case 'id': + case 'name': + case 'siteurl': + case 'piwikid': + return $item [ $column_name ]; + default: + return print_r( $item, true ); + } + } + + private function show_search_form() { + $page = isset( $_REQUEST['page'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['page'] ) ) : ''; + ?> +
+ + search_box( 'Search domain and path', 'wpPiwikSiteSearch' ); ?> +
+ get_global_option( 'disable_timelimit' ) ) { + set_time_limit( 0 ); + } + echo '
'; + echo '

' . esc_html( 'WP-Piwik' === self::$settings->get_global_option( 'plugin_display_name' ) ? 'Piwik ' . esc_html__( 'Statistics', 'wp-piwik' ) : self::$settings->get_global_option( 'plugin_display_name' ) ) . '

'; + if ( self::$settings->check_network_activation() && function_exists( 'is_super_admin' ) && is_super_admin() ) { + if ( isset( $_GET['wpmu_show_stats'] ) ) { + switch_to_blog( (int) $_GET['wpmu_show_stats'] ); + } elseif ( ! empty( $_GET['overview'] ) || ( function_exists( 'is_network_admin' ) && is_network_admin() ) ) { + new \WP_Piwik\Admin\Sitebrowser( self::$wp_piwik ); + return; + } + echo '

' . esc_html__( 'Currently shown stats:', 'wp-piwik' ) . ' ' . esc_html( get_bloginfo( 'name' ) ) . '. Show site overview.

'; + } + echo '
'; + wp_nonce_field( 'wp-piwik_stats-general' ); + wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); + wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); + $columns = array( 'normal', 'side', 'column3' ); + for ( $i = 0; $i < 3; $i++ ) { + // @phpstan-ignore-next-line + echo '
'; + do_meta_boxes( self::$wp_piwik->stats_page_id, $columns[ $i ], null ); + echo '
'; + } + echo '
'; + echo '' . "\n"; + if ( self::$settings->check_network_activation() && function_exists( 'is_super_admin' ) && is_super_admin() ) { + restore_current_blog(); + } + } + + public function print_admin_scripts() { + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AjaxTracker.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AjaxTracker.php new file mode 100644 index 00000000..f6db750a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/AjaxTracker.php @@ -0,0 +1,175 @@ +logger = $logger; + + $idsite = $settings->get_option( 'site_id' ); + if ( ! $idsite ) { + return; + } + + $api_endpoint = rtrim( $settings->get_matomo_url(), '/' ) . '/matomo.php'; + + parent::__construct( (int) $idsite, $api_endpoint ); + + $this->ip = false; + + if ( ! $settings->get_global_option( 'disable_cookies' ) ) { + $cookie_domain = $this->get_tracking_cookie_domain( $settings ); + $this->enableCookies( $cookie_domain ); + } else { + $this->disableCookieSupport(); + } + + if ( $this->loadVisitorIdCookie() ) { + if ( ! empty( $this->cookieVisitorId ) ) { + $this->has_cookie = true; + $this->set_visitor_id_safe( $this->cookieVisitorId ); + } + } + } + + public function set_visitor_id_safe( $visitor_id ) { + try { + $this->setVisitorId( $visitor_id ); + } catch ( \Exception $ex ) { + // do not fatal if the visitor ID is invalid for some reason + if ( ! $this->is_invalid_visitor_id_error( $ex ) ) { + throw $ex; + } + } + } + + protected function setCookie( $cookieName, $cookieValue, $cookieTTL ) { + if ( ! $this->has_cookie ) { + // we only set / overwrite cookies if it is a visitor that has eg no JS enabled or ad blocker enabled etc. + // this way we will track all cart updates and orders into the same visitor on following requests. + // If we recognized the visitor before via cookie we want in our case to make sure to not overwrite + // any cookie + return parent::setCookie( $cookieName, $cookieValue, $cookieTTL ); + } + return $this; + } + + protected function sendRequest( string $url, string $method = 'GET', $data = null, bool $force = false ): string { + if ( ! $this->idSite ) { + $this->logger->log( 'ecommerce tracking could not find idSite, cannot send request' ); + return ''; // not installed or synced yet + } + + if ( $this->is_prerender() ) { + // do not track if for some reason we are prerendering + return ''; + } + + $args = array( + 'method' => $method, + 'headers' => array( + 'User-Agent' => $this->userAgent, + ), + 'blocking' => false, + ); + if ( ! empty( $data ) ) { + $args['body'] = $data; + } + + $url = $url . '&bots=1'; + + try { + $response = $this->wp_remote_request( $url, $args ); + } catch ( \Exception $ex ) { + $this->logger->log( 'ajax_tracker: ' . $ex->getMessage() ); + return ''; + } + + if ( is_wp_error( $response ) ) { + $this->logger->log( 'ajax_tracker: ' . new \Exception( $response->get_error_message() ) ); + return ''; + } + + return $response['body']; + } + + private function is_invalid_visitor_id_error( \Exception $ex ) { + return strpos( $ex->getMessage(), 'setVisitorId() expects' ) === 0; + } + + /** + * See https://developer.chrome.com/docs/web-platform/prerender-pages + * + * @return bool + */ + private function is_prerender() { + // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $purpose = strtolower( isset( $_SERVER['HTTP_SEC_PURPOSE'] ) ? wp_unslash( $_SERVER['HTTP_SEC_PURPOSE'] ) : '' ); + return strpos( $purpose, 'prefetch' ) !== false + || strpos( $purpose, 'prerender' ) !== false; + } + + /** + * for tests to override + * + * @param string $url + * @param array $args + * @return array|\WP_Error + */ + protected function wp_remote_request( $url, $args ) { + return wp_remote_request( $url, $args ); + } + + /** + * In Connect Matomo we want to rely entirely on JavaScript tracker + * for creating cookies. + * + * @return self + */ + protected function setFirstPartyCookies() { + // disabled + return $this; + } + + public static function getCurrentUrl(): string { + return parent::getCurrentUrl(); + } + + public function get_tracking_cookie_domain( Settings $settings ) { + if ( + $settings->get_global_option( 'track_across' ) + || $settings->get_global_option( 'track_crossdomain_linking' ) + ) { + $host = wp_parse_url( home_url(), PHP_URL_HOST ); + if ( ! empty( $host ) ) { + return '*.' . $host; + } + } + + return ''; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger.php new file mode 100644 index 00000000..7221469b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger.php @@ -0,0 +1,57 @@ +set_name( $logger_name ); + $this->set_start_microtime( microtime( true ) ); + $this->log( 'Logging started -------------------------------' ); + } + + public static function make_logger() { + $logger = defined( 'WP_PIWIK_ACTIVATE_LOGGER' ) ? WP_PIWIK_ACTIVATE_LOGGER : 0; + switch ( $logger ) { + case 1: + return new \WP_Piwik\Logger\Screen( __CLASS__ ); + case 2: + return new \WP_Piwik\Logger\File( __CLASS__ ); + default: + return new \WP_Piwik\Logger\Dummy( __CLASS__ ); + } + } + + public function __destruct() { + $this->log( 'Logging finished ------------------------------' ); + } + + public function log( $logger_message ) { + $this->logger_output( $this->get_elapsed_microtime(), $logger_message ); + } + + private function set_name( $logger_name ) { + $this->logger_name = $logger_name; + } + + public function get_name() { + return $this->logger_name; + } + + private function set_start_microtime( $start_microtime ) { + $this->start_microtime = $start_microtime; + } + + public function get_start_microtime() { + return $this->start_microtime; + } + + public function get_elapsed_microtime() { + return microtime( true ) - $this->get_start_microtime(); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php new file mode 100644 index 00000000..20af7b40 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Dummy.php @@ -0,0 +1,10 @@ +logger_file = WP_PIWIK_PATH . 'logs' . DIRECTORY_SEPARATOR . + gmdate( 'Ymd' ) . '_' . $this->encode_filename( $this->get_name() ) . '.log'; + } + + private function get_filename() { + return $this->logger_file; + } + + private function open_file() { + if ( ! $this->logger_file ) { + $this->set_filename(); + } + return fopen( $this->get_filename(), 'a' ); + } + + private function close_file( $file_handle ) { + fclose( $file_handle ); + } + + private function write_file( $file_handle, $file_content ) { + fwrite( $file_handle, $file_content . "\n" ); + } + + private function format_microtime( $logger_time ) { + return sprintf( '[%6s sec]', number_format( $logger_time, 3 ) ); + } + + public function logger_output( $logger_time, $logger_message ) { + $file_handle = $this->open_file(); + if ( $file_handle ) { + $this->write_file( $file_handle, $this->format_microtime( $logger_time ) . ' ' . $logger_message ); + $this->close_file( $file_handle ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php new file mode 100644 index 00000000..7ec7fd8a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Logger/Screen.php @@ -0,0 +1,27 @@ +logs[] = $this->format_microtime( $logger_time ) . ' ' . $logger_message; + } + + public function echo_results() { + echo '
';
+		print_r( $this->logs );
+		echo '
'; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request.php new file mode 100644 index 00000000..8c449598 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request.php @@ -0,0 +1,132 @@ + $method, + 'parameter' => $parameter, + ); + } + return $id; + } + + private static function parameter_to_string( $parameter ) { + $return = ''; + if ( is_array( $parameter ) ) { + foreach ( $parameter as $key => $value ) { + $return .= '&' . $key . '=' . $value; + } + } + return $return; + } + + public function perform( $id ) { + if ( self::$settings->get_global_option( 'cache' ) ) { + $cached = get_transient( 'wp-piwik_c_' . md5( self::$is_cacheable[ $id ] ) ); + if ( ! empty( $cached ) && ! ( ! empty( $cached['result'] ) && 'error' === $cached['result'] ) ) { + self::$wp_piwik->log( 'Deliver cached data: ' . $id ); + return $cached; + } + } + self::$wp_piwik->log( 'Perform request: ' . $id ); + if ( ! isset( self::$requests[ $id ] ) ) { + return array( + 'result' => 'error', + 'message' => 'Request ' . $id . ' was not registered.', + ); + } elseif ( ! isset( self::$results[ $id ] ) ) { + $this->request( $id ); + } + if ( isset( self::$results[ $id ] ) ) { + if ( self::$settings->get_global_option( 'cache' ) && self::$is_cacheable[ $id ] ) { + set_transient( 'wp-piwik_c_' . md5( self::$is_cacheable[ $id ] ), self::$results[ $id ], WEEK_IN_SECONDS ); + } + return self::$results[ $id ]; + } else { + return false; + } + } + + public function get_debug( $id ) { + return isset( self::$debug[ $id ] ) ? self::$debug[ $id ] : false; + } + + protected function build_url( $config ) { + return http_build_query( $this->get_url_params( $config ), '', '&' ); + } + + protected function get_url_params( $config ) { + $params = [ + 'method' => $config['method'], + 'idSite' => self::$settings->get_option( 'site_id' ), + ]; + $params = array_merge( $params, $config['parameter'] ); + return $params; + } + + protected function unserialize( $str ) { + self::$wp_piwik->log( 'Result string: ' . $str ); + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + return ( json_decode( '', true ) === $str || false !== @json_decode( $str, true ) ) ? json_decode( $str, true ) : array(); + } + + public static function get_last_error() { + return self::$last_error; + } + + abstract protected function request( $id ); +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php new file mode 100644 index 00000000..93534a27 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php @@ -0,0 +1,94 @@ +get_global_option( 'piwik_url' ); + foreach ( self::$requests as $request_id => $config ) { + if ( ! isset( self::$results[ $request_id ] ) ) { + if ( '' !== self::$settings->get_global_option( 'filter_limit' ) && is_numeric( self::$settings->get_global_option( 'filter_limit' ) ) ) { + $config['parameter']['filter_limit'] = self::$settings->get_global_option( 'filter_limit' ); + } + $params = $this->get_url_params( $config ); + $params['module'] = 'API'; + $params['format'] = 'json'; + $map[ $count ] = $request_id; + $result = $this->call( $id, $url, $params ); + self::$results[ $map[ $count ] ] = $result; + ++$count; + } + } + } + + private function call( $id, $url, $params ) { + if ( ! defined( 'PIWIK_INCLUDE_PATH' ) ) { + return false; + } + if ( PIWIK_INCLUDE_PATH === false ) { + return array( + 'result' => 'error', + 'message' => __( 'Could not resolve', 'wp-piwik' ) . ' "' . htmlentities( self::$settings->get_global_option( 'piwik_path' ) ) . '": ' . __( 'realpath() returns false', 'wp-piwik' ) . '.', + ); + } + if ( file_exists( PIWIK_INCLUDE_PATH . '/index.php' ) ) { + require_once PIWIK_INCLUDE_PATH . '/index.php'; + } + if ( file_exists( PIWIK_INCLUDE_PATH . '/core/API/Request.php' ) ) { + require_once PIWIK_INCLUDE_PATH . '/core/API/Request.php'; + } + if ( class_exists( '\Piwik\Application\Environment' ) && ! self::$piwik_environment ) { + // Piwik 2.14.* compatibility fix + self::$piwik_environment = new \Piwik\Application\Environment( null ); + self::$piwik_environment->init(); + } + if ( class_exists( 'Piwik\FrontController' ) ) { + \Piwik\FrontController::getInstance()->init(); + } else { + return array( + 'result' => 'error', + 'message' => __( 'Class Piwik\FrontController does not exists.', 'wp-piwik' ), + ); + } + if ( class_exists( 'Piwik\API\Request' ) ) { + $params['token_auth'] = self::$settings->get_global_option( 'piwik_token' ); + $request = new \Piwik\API\Request( $params ); + } else { + return array( + 'result' => 'error', + 'message' => __( 'Class Piwik\API\Request does not exists.', 'wp-piwik' ), + ); + } + + $result = $request->process(); + + if ( ! headers_sent() ) { + header( 'Content-Type: text/html', true ); + } + $result = $this->unserialize( $result ); + if ( $GLOBALS ['wp-piwik_debug'] ) { + self::$debug[ $id ] = array( $params . '&token_auth=...' ); + } + return $result; + } + + public function reset() { + if ( + class_exists( '\Piwik\Application\Environment' ) + && self::$piwik_environment instanceof \Piwik\Application\Environment + ) { + self::$piwik_environment->destroy(); + } + if ( class_exists( 'Piwik\FrontController' ) ) { + \Piwik\FrontController::unsetInstance(); + } + parent::reset(); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php new file mode 100644 index 00000000..4e2cde29 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Request/Rest.php @@ -0,0 +1,126 @@ +get_matomo_url(); + $params = 'module=API&method=API.getBulkRequest&format=json'; + + $filter_limit = self::$settings->get_global_option( 'filter_limit' ); + if ( + $filter_limit > 0 + && is_numeric( self::$settings->get_global_option( 'filter_limit' ) ) + ) { + $params .= '&filter_limit=' . self::$settings->get_global_option( 'filter_limit' ); + } + foreach ( self::$requests as $request_id => $config ) { + if ( ! isset( self::$results[ $request_id ] ) ) { + $params .= '&urls[' . $count . ']=' . rawurlencode( $this->build_url( $config ) ); + $map[ $count ] = $request_id; + ++$count; + } + } + $use_curl = ( + function_exists( 'curl_init' ) + && ini_get( 'allow_url_fopen' ) + && 'curl' === self::$settings->get_global_option( 'http_connection' ) + ) || ( + function_exists( 'curl_init' ) + && ! ini_get( 'allow_url_fopen' ) + ); + $results = $use_curl ? $this->curl( $id, $url, $params ) : $this->fopen( $id, $url, $params ); + if ( is_array( $results ) ) { + foreach ( $results as $num => $result ) { + if ( isset( $map[ $num ] ) ) { + self::$results[ $map[ $num ] ] = $result; + } + } + } + } + + private function curl( $id, $url, $params ) { + if ( 'post' === self::$settings->get_global_option( 'http_method' ) ) { + $c = curl_init( $url ); + curl_setopt( $c, CURLOPT_POST, 1 ); + curl_setopt( $c, CURLOPT_POSTFIELDS, $params . '&token_auth=' . self::$settings->get_global_option( 'piwik_token' ) ); + } else { + $c = curl_init( $url . '?' . $params . '&token_auth=' . self::$settings->get_global_option( 'piwik_token' ) ); + } + curl_setopt( $c, CURLOPT_SSL_VERIFYPEER, ! self::$settings->get_global_option( 'disable_ssl_verify' ) ); + curl_setopt( $c, CURLOPT_SSL_VERIFYHOST, ! self::$settings->get_global_option( 'disable_ssl_verify_host' ) ? 2 : 0 ); + curl_setopt( $c, CURLOPT_USERAGENT, 'php' === self::$settings->get_global_option( 'piwik_useragent' ) ? ini_get( 'user_agent' ) : self::$settings->get_global_option( 'piwik_useragent_string' ) ); + curl_setopt( $c, CURLOPT_RETURNTRANSFER, 1 ); + curl_setopt( $c, CURLOPT_HEADER, $GLOBALS ['wp-piwik_debug'] ); + curl_setopt( $c, CURLOPT_TIMEOUT, self::$settings->get_global_option( 'connection_timeout' ) ); + $http_proxy_class = new \WP_HTTP_Proxy(); + if ( $http_proxy_class->is_enabled() && $http_proxy_class->send_through_proxy( $url ) ) { + curl_setopt( $c, CURLOPT_PROXY, $http_proxy_class->host() ); + curl_setopt( $c, CURLOPT_PROXYPORT, $http_proxy_class->port() ); + if ( $http_proxy_class->use_authentication() ) { + curl_setopt( $c, CURLOPT_PROXYUSERPWD, $http_proxy_class->username() . ':' . $http_proxy_class->password() ); + } + } + $result = curl_exec( $c ); + self::$last_error = curl_error( $c ); + if ( $GLOBALS ['wp-piwik_debug'] ) { + $header_size = curl_getinfo( $c, CURLINFO_HEADER_SIZE ); + $header = substr( $result, 0, $header_size ); + $body = substr( $result, $header_size ); + $result = $this->unserialize( $body ); + self::$debug[ $id ] = array( $header, $url . '?' . $params . '&token_auth=...' ); + } else { + $result = $this->unserialize( $result ); + } + if ( version_compare( PHP_VERSION, '8', '<' ) ) { + curl_close( $c ); + } + return $result; + } + + private function fopen( $id, $url, $params ) { + $context_definition = array( + 'http' => array( + 'timeout' => self::$settings->get_global_option( 'connection_timeout' ), + 'header' => "Content-type: application/x-www-form-urlencoded\r\n", + ), + ); + $context_definition['ssl'] = array(); + if ( self::$settings->get_global_option( 'disable_ssl_verify' ) ) { + $context_definition['ssl'] = array( + 'allow_self_signed' => true, + 'verify_peer' => false, + ); + } + if ( self::$settings->get_global_option( 'disable_ssl_verify_host' ) ) { + $context_definition['ssl']['verify_peer_name'] = false; + } + if ( self::$settings->get_global_option( 'http_method' ) === 'post' ) { + $full_url = $url; + $context_definition['http']['method'] = 'POST'; + $context_definition['http']['content'] = $params . '&token_auth=' . self::$settings->get_global_option( 'piwik_token' ); + } else { + $full_url = $url . '?' . $params . '&token_auth=' . self::$settings->get_global_option( 'piwik_token' ); + } + $context = stream_context_create( $context_definition ); + + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + $result = $this->unserialize( @file_get_contents( $full_url, false, $context ) ); + if ( $GLOBALS ['wp-piwik_debug'] ) { + self::$debug[ $id ] = array( get_headers( $full_url, 1 ), $url . '?' . $params . '&token_auth=...' ); + } + return $result; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Settings.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Settings.php new file mode 100644 index 00000000..79cd75ad --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Settings.php @@ -0,0 +1,486 @@ + 'check_piwik_url', + 'piwik_token' => 'check_piwik_token', + 'site_id' => 'request_piwik_site_id', + 'tracking_code' => 'prepare_tracking_code', + 'noscript_code' => 'prepare_nocscript_code', + ); + + /** + * @var array default configuration set + */ + private $global_settings = array( + // Plugin settings + 'revision' => 0, + 'last_settings_update' => 0, + // User settings: Piwik configuration + 'piwik_mode' => 'http', + 'piwik_url' => '', + 'piwik_path' => '', + 'piwik_user' => '', + 'matomo_user' => '', + 'piwik_token' => '', + 'auto_site_config' => true, + // User settings: Stats configuration + 'default_date' => 'yesterday', + 'stats_seo' => false, + 'stats_ecommerce' => false, + 'dashboard_widget' => false, + 'dashboard_ecommerce' => false, + 'dashboard_chart' => false, + 'dashboard_seo' => false, + 'toolbar' => false, + 'capability_read_stats' => array( + 'administrator' => true, + ), + 'perpost_stats' => 'disabled', + 'plugin_display_name' => 'Connect Matomo', + 'piwik_shortcut' => false, + 'shortcodes' => false, + // User settings: Tracking configuration + 'track_mode' => 'disabled', + 'track_codeposition' => 'footer', + 'track_noscript' => false, + 'track_nojavascript' => false, + 'proxy_url' => '', + 'track_content' => 'disabled', + 'track_search' => false, + 'track_404' => false, + 'add_post_annotations' => array(), + 'add_customvars_box' => false, + 'add_download_extensions' => '', + 'set_download_extensions' => '', + 'set_link_classes' => '', + 'set_download_classes' => '', + 'require_consent' => 'disabled', + 'disable_cookies' => false, + 'limit_cookies' => false, + 'limit_cookies_visitor' => 34186669, // Piwik default 13 months + 'limit_cookies_session' => 1800, // Piwik default 30 minutes + 'limit_cookies_referral' => 15778463, // Piwik default 6 months + 'track_admin' => false, + 'capability_stealth' => array(), + 'track_across' => false, + 'track_across_alias' => false, + 'track_crossdomain_linking' => false, + 'track_feed' => false, + 'track_feed_addcampaign' => false, + 'track_feed_campaign' => 'feed', + 'track_heartbeat' => 0, + 'track_user_id' => 'disabled', + // User settings: Expert configuration + 'cache' => true, + 'http_connection' => 'curl', + 'http_method' => 'post', + 'disable_timelimit' => false, + 'filter_limit' => '', + 'connection_timeout' => 5, + 'disable_ssl_verify' => false, + 'disable_ssl_verify_host' => false, + 'piwik_useragent' => 'php', + 'piwik_useragent_string' => 'WP-Piwik', + 'dnsprefetch' => false, + 'track_datacfasync' => false, + 'track_cdnurl' => '', + 'track_cdnurlssl' => '', + 'force_protocol' => 'disabled', + 'remove_type_attribute' => false, + 'update_notice' => 'enabled', + + self::TRACK_AI_BOTS => false, + self::TRACK_AI_BOTS_USING_ESI => false, + ); + + private $settings = array( + 'name' => '', + 'site_id' => null, + 'noscript_code' => '', + 'tracking_code' => '', + 'last_tracking_code_update' => 0, + 'dashboard_revision' => 0, + ); + + private $settings_changed = false; + + /** + * Constructor class to prepare settings manager + * + * @param \WP_Piwik $wp_piwik + * active WP-Piwik instance + */ + public function __construct( $wp_piwik ) { + self::$wp_piwik = $wp_piwik; + self::$wp_piwik->log( 'Store default settings' ); + self::$default_settings = array( + 'globalSettings' => $this->global_settings, + 'settings' => $this->settings, + ); + self::$wp_piwik->log( 'Load settings' ); + foreach ( $this->global_settings as $key => $default ) { + $this->global_settings [ $key ] = ( $this->check_network_activation() ? get_site_option( 'wp-piwik_global-' . $key, $default ) : get_option( 'wp-piwik_global-' . $key, $default ) ); + } + foreach ( $this->settings as $key => $default ) { + $this->settings [ $key ] = get_option( 'wp-piwik-' . $key, $default ); + } + } + + /** + * Save all settings as WordPress options + */ + public function save() { + global $wp_roles; + + if ( ! $this->settings_changed ) { + self::$wp_piwik->log( 'No settings changed yet' ); + return; + } + self::$wp_piwik->log( 'Save settings' ); + $this->global_settings['plugin_display_name'] = htmlspecialchars( $this->global_settings['plugin_display_name'], ENT_QUOTES, 'utf-8' ); + foreach ( $this->global_settings as $key => $value ) { + if ( $this->check_network_activation() ) { + update_site_option( 'wp-piwik_global-' . $key, $value ); + } else { + update_option( 'wp-piwik_global-' . $key, $value ); + } + } + foreach ( $this->settings as $key => $value ) { + update_option( 'wp-piwik-' . $key, $value ); + } + foreach ( $wp_roles->role_names as $str_key => $str_name ) { + $obj_role = get_role( $str_key ); + $caps = array( 'stealth', 'read_stats' ); + foreach ( $caps as $str_cap ) { + $ary_caps = $this->get_global_option( 'capability_' . $str_cap ); + if ( isset( $ary_caps [ $str_key ] ) && $ary_caps [ $str_key ] ) { + $wp_roles->add_cap( $str_key, 'wp-piwik_' . $str_cap ); + } else { + $wp_roles->remove_cap( $str_key, 'wp-piwik_' . $str_cap ); + } + } + } + $this->settings_changed = false; + } + + /** + * Get a global option's value which should not be empty + * + * @param string $key + * option key + * @return string option value + */ + public function get_not_empty_global_option( $key ) { + return isset( $this->global_settings [ $key ] ) && ! empty( $this->global_settings [ $key ] ) ? $this->global_settings [ $key ] : self::$default_settings ['globalSettings'] [ $key ]; + } + + /** + * Get a global option's value + * + * @param string $key + * option key + * @return mixed option value + */ + public function get_global_option( $key ) { + return isset( $this->global_settings [ $key ] ) ? $this->global_settings [ $key ] : self::$default_settings ['globalSettings'] [ $key ]; + } + + /** + * Get an option's value related to a specific blog + * + * @param string $key + * option key + * @param int $blog_id + * blog ID (default: current blog) + * @return mixed + */ + public function get_option( $key, $blog_id = null ) { + if ( $this->check_network_activation() && ! empty( $blog_id ) ) { + return get_blog_option( $blog_id, 'wp-piwik-' . $key ); + } + return isset( $this->settings [ $key ] ) ? $this->settings [ $key ] : self::$default_settings ['settings'] [ $key ]; + } + + /** + * Set a global option's value + * + * @param string $key + * option key + * @param mixed $value + * new option value + */ + public function set_global_option( $key, $value ) { + $this->settings_changed = true; + self::$wp_piwik->log( 'Changed global option ' . $key . ': ' . ( is_array( $value ) ? wp_json_encode( $value ) : $value ) ); + $this->global_settings [ $key ] = $value; + } + + /** + * Set an option's value related to a specific blog + * + * @param string $key + * option key + * @param string $value + * new option value + * @param int $blog_id + * blog ID (default: current blog) + */ + public function set_option( $key, $value, $blog_id = null ) { + if ( empty( $blog_id ) ) { + $blog_id = get_current_blog_id(); + } + $this->settings_changed = true; + self::$wp_piwik->log( 'Changed option ' . $key . ': ' . $value ); + if ( $this->check_network_activation() ) { + update_blog_option( $blog_id, 'wp-piwik-' . $key, $value ); + } + if ( get_current_blog_id() === $blog_id ) { + $this->settings [ $key ] = $value; + } + } + + /** + * Reset settings to default + */ + public function reset_settings() { + self::$wp_piwik->log( 'Reset WP-Piwik settings' ); + global $wpdb; + if ( $this->check_network_activation() ) { + $ary_blogs = self::get_blog_list(); + if ( is_array( $ary_blogs ) ) { + foreach ( $ary_blogs as $ary_blog ) { + switch_to_blog( $ary_blog['blog_id'] ); + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'wp-piwik-%'" ); + restore_current_blog(); + } + } + $wpdb->query( "DELETE FROM $wpdb->sitemeta WHERE meta_key LIKE 'wp-piwik_global-%'" ); + } else { + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'wp-piwik_global-%'" ); + } + } + + /** + * Get blog list + */ + public static function get_blog_list( $limit = null, $page = null, $search = '' ) { + global $wpdb; + + $query_limit = ''; + if ( $limit && $page ) { + $query_limit = ' LIMIT ' . (int) ( ( $page - 1 ) * $limit ) . ',' . (int) $limit; + } + + $like = '%' . $wpdb->esc_like( $search ) . '%'; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared + return $wpdb->get_results( $wpdb->prepare( "SELECT blog_id FROM {$wpdb->blogs} WHERE CONCAT(domain, path) LIKE %s AND spam = 0 AND deleted = 0 ORDER BY blog_id" . $query_limit, $like ), ARRAY_A ); + } + + /** + * Check if plugin is network activated + * + * @return boolean Is network activated? + */ + public function check_network_activation() { + if ( ! function_exists( 'is_plugin_active_for_network' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + return is_plugin_active_for_network( 'wp-piwik/wp-piwik.php' ); + } + + /** + * Apply new configuration + * + * @param array $in + * new configuration set + */ + public function apply_changes( $in ) { + if ( ! self::$wp_piwik->is_valid_options_post() ) { + die( 'Invalid config changes.' ); + } + $in = $this->check_settings( $in ); + self::$wp_piwik->log( 'Apply changed settings:' ); + foreach ( self::$default_settings ['globalSettings'] as $key => $val ) { + $this->set_global_option( $key, isset( $in [ $key ] ) ? $in [ $key ] : $val ); + } + foreach ( self::$default_settings ['settings'] as $key => $val ) { + $this->set_option( $key, isset( $in [ $key ] ) ? $in [ $key ] : $val ); + } + $this->set_global_option( 'last_settings_update', (string) time() ); + $this->save(); + } + + /** + * Apply callback function on new settings + * + * @param array $in new configuration set + * @return array configuration set after callback functions were applied + */ + private function check_settings( $in ) { + foreach ( $this->check_settings as $key => $value ) { + if ( isset( $in [ $key ] ) ) { + $in [ $key ] = call_user_func_array( + array( + $this, + $value, + ), + array( + $in [ $key ], + $in, + ) + ); + } + } + return $in; + } + + /** + * Add slash to Piwik URL if necessary + * + * @param string $value + * Piwik URL + * @return string Piwik URL + * @phpstan-ignore method.unused + */ + private function check_piwik_url( $value ) { + return substr( $value, - 1, 1 ) !== '/' ? $value . '/' : $value; + } + + /** + * Remove &token_auth= from auth token + * + * @param string $value + * Piwik auth token + * @return string Piwik auth token + * @phpstan-ignore method.unused + */ + private function check_piwik_token( $value ) { + return str_replace( '&token_auth=', '', $value ); + } + + /** + * Request the site ID (if not set before) + * + * @param string|int $value + * site ID setting value + * @param array $in + * configuration set + * @return int Piwik site ID + * @phpstan-ignore method.unused + */ + private function request_piwik_site_id( $value, $in ) { + if ( $in ['auto_site_config'] && ! $value ) { + return self::$wp_piwik->get_piwik_site_id(); + } + return intval( $value ); + } + + /** + * Prepare the tracking code + * + * @param string $value + * tracking code + * @param array $in + * configuration set + * @return string tracking code + * @phpstan-ignore method.unused + */ + private function prepare_tracking_code( $value, $in ) { + if ( 'manually' === $in['track_mode'] || 'disabled' === $in['track_mode'] ) { + $value = stripslashes( $value ); + if ( $this->check_network_activation() ) { + update_site_option( 'wp-piwik-manually', $value ); + } + return $value; + } + + return ''; + } + + /** + * Prepare the nocscript code + * + * @param string $value + * noscript code + * @param array $in + * configuration set + * @return string noscript code + * @phpstan-ignore method.unused + */ + private function prepare_nocscript_code( $value, $in ) { + if ( 'manually' === $in['track_mode'] ) { + return stripslashes( $value ); + } + return $this->get_option( 'noscript_code' ); + } + + /** + * Get debug data + * + * @return array WP-Piwik settings for debug output + */ + public function get_debug_data() { + $debug = array( + 'global_settings' => $this->global_settings, + 'settings' => $this->settings, + ); + $debug['global_settings']['piwik_token'] = ! empty( $debug['global_settings']['piwik_token'] ) ? 'set' : 'not set'; + return $debug; + } + + public function is_ai_bot_tracking_enabled() { + return (bool) $this->get_global_option( self::TRACK_AI_BOTS ); + } + + public function is_ai_bot_tracking_enabled_via_esi_includes() { + return (bool) $this->get_global_option( self::TRACK_AI_BOTS_USING_ESI ); + } + + public function is_track_via_esi_enabled() { + return true === (bool) $this->get_global_option( 'track_ai_bots_using_esi' ); + } + + public function get_matomo_url() { + if ( 'http' === $this->get_global_option( 'piwik_mode' ) ) { + return $this->get_global_option( 'piwik_url' ); + } + + if ( 'cloud' === $this->get_global_option( 'piwik_mode' ) ) { + return 'https://' . $this->get_global_option( 'piwik_user' ) . '.innocraft.cloud/'; + } + + return 'https://' . $this->get_global_option( 'matomo_user' ) . '.matomo.cloud/'; + } + + public function is_tracking_enabled() { + return 'disabled' !== $this->get_global_option( 'track_mode' ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php new file mode 100644 index 00000000..c90f79ab --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Shortcode.php @@ -0,0 +1,34 @@ + 'OptOut', + 'post' => 'Post', + 'overview' => 'Overview', + ); + + private $content; + + /** + * @param array $attributes + * @param \WP_Piwik $wp_piwik + * @param Settings $settings + */ + public function __construct( $attributes, $wp_piwik, $settings ) { + $wp_piwik->log( 'Check requested shortcode widget ' . $attributes['module'] ); + if ( isset( $attributes['module'] ) && isset( $this->available[ $attributes['module'] ] ) ) { + $wp_piwik->log( 'Add shortcode widget ' . $this->available[ $attributes['module'] ] ); + $class = '\\WP_Piwik\\Widget\\' . $this->available[ $attributes['module'] ]; + $widget = new $class( $wp_piwik, $settings, null, null, null, $attributes, true ); + $widget->show(); + $this->content = $widget->get(); + } + } + + public function get() { + return $this->content; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template.php new file mode 100644 index 00000000..d0113b71 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template.php @@ -0,0 +1,45 @@ +' . esc_html( $name ) . '' . esc_html( $value ) . ''; + } + + public function get_range_last30() { + $diff = ( self::$settings->get_global_option( 'default_date' ) === 'yesterday' ) ? -86400 : 0; + $end = time() + $diff; + $start = time() - 2592000 + $diff; + return gmdate( 'Y-m-d', $start ) . ',' . gmdate( 'Y-m-d', $end ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php new file mode 100644 index 00000000..5aeda464 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Template/MetaBoxCustomVars.php @@ -0,0 +1,75 @@ + + + + + + + + + + +
+

. (.)

+ post_type ); + // Check if the current user has permission to edit the post. + if ( ! current_user_can( $obj_post_type->cap->edit_post, $int_id ) ) { + return $int_id; + } + $ary_names = array( 'cat', 'val' ); + for ( $i = 1; $i <= 5; $i++ ) { + for ( $j = 0; $j <= 1; $j++ ) { + // Create key + $str_meta_key = 'wp-piwik_custom_' . $ary_names[ $j ] . $i; + // Get data + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $str_meta_val = isset( $_POST[ $str_meta_key ] ) ? esc_html( wp_unslash( $_POST[ $str_meta_key ] ) ) : ''; + // Get the meta value of the custom field key + $str_cur_val = get_post_meta( $int_id, $str_meta_key, true ); + if ( $str_meta_val && '' === $str_cur_val ) { + // Add meta val: + add_post_meta( $int_id, $str_meta_key, $str_meta_val, true ); + } elseif ( $str_meta_val && $str_meta_val !== $str_cur_val ) { + // Update meta val: + update_post_meta( $int_id, $str_meta_key, $str_meta_val ); + } elseif ( '' === $str_meta_val && $str_cur_val ) { + // Delete meta val: + delete_post_meta( $int_id, $str_meta_key, $str_cur_val ); + } + } + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php new file mode 100644 index 00000000..0e575e84 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php @@ -0,0 +1,264 @@ +is_current_tracking_code() || ! self::$wp_piwik->get_option( 'tracking_code' ) || strpos( self::$wp_piwik->get_option( 'tracking_code' ), '{"result":"error",' ) !== false ) { + self::$wp_piwik->update_tracking_code(); + } + $this->tracking_code = ( self::$wp_piwik->is_network_mode() && self::$wp_piwik->get_global_option( 'track_mode' ) === 'manually' ) ? get_site_option( 'wp-piwik-manually' ) : self::$wp_piwik->get_option( 'tracking_code' ); + } + + public function get_tracking_code() { + if ( $this->is_usertracking ) { + $this->apply_user_tracking(); + } + if ( $this->is_404 ) { + $this->apply_404_changes(); + } + if ( $this->is_search ) { + $this->apply_search_changes(); + } + if ( is_single() || is_page() ) { + $this->add_custom_values(); + } + // ignoring for BC + // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound + // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + $this->tracking_code = apply_filters( 'wp-piwik_tracking_code', $this->tracking_code ); + return $this->tracking_code; + } + + /** + * @param string $code + * @param Settings $settings + * @param Logger $logger + * @return array + */ + public static function prepare_tracking_code( $code, $settings, $logger ) { + global $current_user; + $logger->log( 'Apply tracking code changes:' ); + $settings->set_option( 'last_tracking_code_update', (string) time() ); + if ( preg_match( '/var u="([^"]*)";/', $code, $hits ) ) { + $fetched_proxy_url = $hits [1]; + } else { + $fetched_proxy_url = ''; + } + if ( $settings->get_global_option( 'remove_type_attribute' ) ) { + $code = str_replace( + array( ' type="text/javascript"', " type='text/javascript'" ), + '', + $code + ); + } + if ( 'js' === $settings->get_global_option( 'track_mode' ) ) { + $code = str_replace( + array( + 'piwik.js', + 'piwik.php', + 'matomo.js', + 'matomo.php', + ), + 'js/index.php', + $code + ); + } elseif ( 'proxy' === $settings->get_global_option( 'track_mode' ) ) { + $code = str_replace( 'piwik.js', 'matomo.php', $code ); + $code = str_replace( 'matomo.js', 'matomo.php', $code ); + $code = str_replace( 'piwik.php', 'matomo.php', $code ); + $proxy = str_replace( + array( + 'https://', + 'http://', + ), + '//', + plugins_url( 'wp-piwik' ) . '/proxy' + ) . '/'; + $code = preg_replace( '/var u="([^"]*)";/', 'var u="' . $proxy . '"', $code ); + $code = preg_replace( '/img src="([^"]*)piwik.php/', 'img src="' . $proxy . 'matomo.php', $code ); + $code = preg_replace( '/img src="([^"]*)matomo.php/', 'img src="' . $proxy . 'matomo.php', $code ); + } + if ( $settings->get_global_option( 'track_cdnurl' ) || $settings->get_global_option( 'track_cdnurlssl' ) ) { + $code = str_replace( + array( + 'var d=doc', + 'g.src=u+', + ), + array( + "var ucdn=(('https:' == document.location.protocol) ? 'https://" . ( $settings->get_global_option( 'track_cdnurlssl' ) ? $settings->get_global_option( 'track_cdnurlssl' ) : $settings->get_global_option( 'track_cdnurl' ) ) . "/' : 'http://" . ( $settings->get_global_option( 'track_cdnurl' ) ? $settings->get_global_option( 'track_cdnurl' ) : $settings->get_global_option( 'track_cdnurlssl' ) ) . "/');\nvar d=doc", + 'g.src=ucdn+', + ), + $code + ); + } + + if ( $settings->get_global_option( 'track_datacfasync' ) ) { + $code = str_replace( ' + get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Browser Details', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'DevicesDetection.getBrowserVersions'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Browser', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php new file mode 100644 index 00000000..67586ae1 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Browsers.php @@ -0,0 +1,83 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Browsers', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'DevicesDetection.getBrowsers'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Browser', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } elseif ( $count === $this->limit ) { + $css_class['Others'] = ''; + $js['Others'] = ''; + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php new file mode 100644 index 00000000..ddca703d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Chart.php @@ -0,0 +1,100 @@ +request_data(); + $response = $result['response']; + if ( ! $result['success'] ) { + $message = ''; + if ( is_array( $this->method ) ) { + foreach ( $this->method as $m ) { + if ( empty( $response[ $m ]['message'] ) ) { + continue; + } + + $message .= ' ' . $m . ' - ' . $response[ $m ]['message']; + } + } else { + $message = $response[ $this->method ]['message']; + } + + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $message ); + } else { + $values = array(); + $labels = array(); + $bounced = array(); + $unique = array(); + $count = 0; + $unique_sum = 0; + if ( is_array( $response['VisitsSummary.getVisits'] ) ) { + foreach ( $response['VisitsSummary.getVisits'] as $date => $value ) { + ++$count; + $values [] = $value; + $unique [] = $response['VisitsSummary.getUniqueVisitors'][ $date ]; + $bounced [] = $response['VisitsSummary.getBounceCount'][ $date ]; + if ( 'week' === $this->parameter['period'] ) { + preg_match( '/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/', $date, $date_list ); + $text_key = $this->date_format( $date_list[0], 'short_week' ); + } else { + $text_key = substr( $date, -2 ); + } + $labels [] = array( $text_key ); + $unique_sum += $response['VisitsSummary.getActions'][ $date ]; + } + } else { + $values = array( 0 ); + $labels = array( array( 0, '-' ) ); + $unique = array( 0 ); + $bounced = array( 0 ); + } + $average = round( $unique_sum / 30, 0 ); + ?> +
+ +
+ + get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Cities', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'UserCountry.getCity'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'City', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } elseif ( $count === $this->limit ) { + $css_class['Others'] = ''; + $js['Others'] = ''; + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php new file mode 100644 index 00000000..40d381a9 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Country.php @@ -0,0 +1,83 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Countries', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'UserCountry.getCountry '; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Country', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } elseif ( $count === $this->limit ) { + $css_class['Others'] = ''; + $js['Others'] = ''; + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php new file mode 100644 index 00000000..31bee8a1 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Ecommerce.php @@ -0,0 +1,53 @@ +get_time_settings(); + $this->title = $prefix . __( 'E-Commerce', 'wp-piwik' ); + $this->method = 'Goals.get'; + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = null; + $revenue = is_numeric( $this->value( $response, 'revenue' ) ) ? number_format( (float) $this->value( $response, 'revenue' ), 2 ) : ''; + $revenue_new = is_numeric( $this->value( $response, 'revenue_new_visit' ) ) ? number_format( (float) $this->value( $response, 'revenue_new_visit' ), 2 ) : ''; + $revenue_return = is_numeric( $this->value( $response, 'revenue_returning_visit' ) ) ? number_format( (float) $this->value( $response, 'revenue_returning_visit' ), 2 ) : ''; + $table_body = array( + array( __( 'Conversions', 'wp-piwik' ) . ':', $this->value( $response, 'nb_conversions' ) ), + array( __( 'Visits converted', 'wp-piwik' ) . ':', $this->value( $response, 'nb_visits_converted' ) ), + array( __( 'Revenue', 'wp-piwik' ) . ':', $revenue ), + array( __( 'Conversion rate', 'wp-piwik' ) . ':', $this->value( $response, 'conversion_rate' ) ), + array( __( 'Conversions (new visitor)', 'wp-piwik' ) . ':', $this->value( $response, 'nb_conversions_new_visit' ) ), + array( __( 'Visits converted (new visitor)', 'wp-piwik' ) . ':', $this->value( $response, 'nb_visits_converted_new_visit' ) ), + array( __( 'Revenue (new visitor)', 'wp-piwik' ) . ':', $revenue_new ), + array( __( 'Conversion rate (new visitor)', 'wp-piwik' ) . ':', $this->value( $response, 'conversion_rate_new_visit' ) ), + array( __( 'Conversions (returning visitor)', 'wp-piwik' ) . ':', $this->value( $response, 'nb_conversions_returning_visit' ) ), + array( __( 'Visits converted (returning visitor)', 'wp-piwik' ) . ':', $this->value( $response, 'nb_visits_converted_returning_visit' ) ), + array( __( 'Revenue (returning visitor)', 'wp-piwik' ) . ':', $revenue_return ), + array( __( 'Conversion rate (returning visitor)', 'wp-piwik' ) . ':', $this->value( $response, 'conversion_rate_returning_visit' ) ), + ); + $table_foot = self::$settings->get_global_option( 'piwik_shortcut' ) + ? array( + esc_html__( 'Shortcut', 'wp-piwik' ) . ':', + 'Piwik', + ) + : null; + $this->table( $table_head, $table_body, $table_foot ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php new file mode 100644 index 00000000..ab2357ac --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Items.php @@ -0,0 +1,55 @@ +get_time_settings(); + $this->title = $prefix . __( 'E-Commerce Items', 'wp-piwik' ); + $this->method = 'Goals.getItemsName'; + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( + __( 'Label', 'wp-piwik' ), + __( 'Revenue', 'wp-piwik' ), + __( 'Quantity', 'wp-piwik' ), + __( 'Orders', 'wp-piwik' ), + __( 'Avg. price', 'wp-piwik' ), + __( 'Avg. quantity', 'wp-piwik' ), + __( 'Conversion rate', 'wp-piwik' ), + ); + $table_body = array(); + if ( is_array( $response ) ) { + foreach ( $response as $data ) { + array_push( + $table_body, + array( + $data['label'], + number_format( $data['revenue'], 2 ), + $data['quantity'], + $data['orders'], + number_format( $data['avg_price'], 2 ), + $data['avg_quantity'], + $data['conversion_rate'], + ) + ); + } + } + $table_foot = array(); + $this->table( $table_head, $table_body, $table_foot ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php new file mode 100644 index 00000000..77ad976b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/ItemsCategory.php @@ -0,0 +1,55 @@ +get_time_settings(); + $this->title = $prefix . __( 'E-Commerce Item Categories', 'wp-piwik' ); + $this->method = 'Goals.getItemsCategory'; + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( + __( 'Label', 'wp-piwik' ), + __( 'Revenue', 'wp-piwik' ), + __( 'Quantity', 'wp-piwik' ), + __( 'Orders', 'wp-piwik' ), + __( 'Avg. price', 'wp-piwik' ), + __( 'Avg. quantity', 'wp-piwik' ), + __( 'Conversion rate', 'wp-piwik' ), + ); + $table_body = array(); + if ( is_array( $response ) ) { + foreach ( $response as $data ) { + array_push( + $table_body, + array( + $data['label'], + isset( $data['revenue'] ) ? number_format( $data['revenue'], 2 ) : '-.--', + isset( $data['quantity'] ) ? $data['quantity'] : '-', + isset( $data['orders'] ) ? $data['orders'] : '-', + number_format( $data['avg_price'], 2 ), + $data['avg_quantity'], + $data['conversion_rate'], + ) + ); + } + } + $table_foot = array(); + $this->table( $table_head, $table_body, $table_foot ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php new file mode 100644 index 00000000..beff7afa --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Keywords.php @@ -0,0 +1,20 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Keywords', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'Referrers.getKeywords'; + $this->name = 'Keyword'; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php new file mode 100644 index 00000000..66c2a021 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Models.php @@ -0,0 +1,83 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Models', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'DevicesDetection.getModel'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Model', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( htmlentities( $row['label'] ), $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } elseif ( $count === $this->limit ) { + $css_class['Others'] = ''; + $js['Others'] = ''; + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php new file mode 100644 index 00000000..24a99264 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Noresult.php @@ -0,0 +1,43 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Site Search', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'Actions.getSiteSearchNoResultKeywords'; + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( + ! empty( $response['result'] ) + && 'error' === $response['result'] + ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Keyword', 'wp-piwik' ), __( 'Requests', 'wp-piwik' ), __( 'Bounced', 'wp-piwik' ) ); + $table_body = array(); + $count = 0; + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $table_body[] = array( $row['label'], $row['nb_visits'], $row['bounce_rate'] ); + if ( 10 === $count ) { + break; + } + } + } + $this->table( $table_head, $table_body, null ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php new file mode 100644 index 00000000..c518ef19 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/OptOut.php @@ -0,0 +1,35 @@ +parameter = $params; + } + + public function show() { + $protocol = ( isset( $_SERVER ['HTTPS'] ) && 'off' !== $_SERVER ['HTTPS'] ) ? 'https' : 'http'; + switch ( self::$settings->get_global_option( 'piwik_mode' ) ) { + case 'php': + $piwik_url = $protocol . ':' . self::$settings->get_global_option( 'proxy_url' ); + break; + case 'cloud': + $piwik_url = 'https://' . self::$settings->get_global_option( 'piwik_user' ) . '.innocraft.cloud/'; + break; + case 'cloud-matomo': + $piwik_url = 'https://' . self::$settings->get_global_option( 'matomo_user' ) . '.matomo.cloud/'; + break; + default: + $piwik_url = self::$settings->get_global_option( 'piwik_url' ); + break; + } + $width = ( isset( $this->parameter['width'] ) ? rawurlencode( $this->parameter['width'] ) : '' ); + $height = ( isset( $this->parameter['height'] ) ? rawurlencode( $this->parameter['height'] ) : '' ); + $idsite = ( isset( $this->parameter['idsite'] ) ? 'idsite=' . (int) $this->parameter['idsite'] . '&' : '' ); + $language = ( isset( $this->parameter['language'] ) ? rawurlencode( $this->parameter['language'] ) : 'en' ); + $this->out( '' ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php new file mode 100644 index 00000000..c893dc1d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Overview.php @@ -0,0 +1,77 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => isset( $params['period'] ) ? $params['period'] : $time_settings['period'], + 'date' => isset( $params['date'] ) ? $params['date'] : $time_settings['date'], + 'description' => $time_settings['description'], + ); + $this->title = ! $this->is_shortcode ? $prefix . __( 'Overview', 'wp-piwik' ) . ' (' . ( 'dashboard' === $this->page_id ? $this->range_name() : $time_settings['description'] ) . ')' : ( $params['title'] ? $params['title'] : '' ); + $this->method = 'VisitsSummary.get'; + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + if ( in_array( $this->parameter['date'], array( 'last30', 'last60', 'last90' ), true ) ) { + $result = array(); + if ( is_array( $response ) ) { + foreach ( $response as $data ) { + foreach ( $data as $key => $value ) { + if ( isset( $result[ $key ] ) && is_numeric( $value ) ) { + $result[ $key ] += $value; + } elseif ( is_numeric( $value ) ) { + $result[ $key ] = $value; + } else { + $result[ $key ] = 0; + } + } + } + if ( isset( $result['nb_visits'] ) && $result['nb_visits'] > 0 ) { + $result['nb_actions_per_visit'] = round( $result['nb_actions'] / $result['nb_visits'], 1 ); + $result['bounce_rate'] = round( $result['bounce_count'] / $result['nb_visits'] * 100, 1 ) . '%'; + $result['avg_time_on_site'] = round( $result['sum_visit_length'] / $result['nb_visits'], 0 ); + } else { + $result['nb_actions_per_visit'] = 0; + $result['bounce_rate'] = 0; + $result['avg_time_on_site'] = 0; + } + } + $response = $result; + } + $time = isset( $response['sum_visit_length'] ) ? $this->time_format( $response['sum_visit_length'] ) : '-'; + $avg_time = isset( $response['avg_time_on_site'] ) ? $this->time_format( $response['avg_time_on_site'] ) : '-'; + $table_head = null; + $table_body = array( array( __( 'Visitors', 'wp-piwik' ) . ':', $this->value( $response, 'nb_visits' ) ) ); + if ( '-' !== $this->value( $response, 'nb_uniq_visitors' ) ) { + array_push( $table_body, array( __( 'Unique visitors', 'wp-piwik' ) . ':', $this->value( $response, 'nb_uniq_visitors' ) ) ); + } + array_push( + $table_body, + array( __( 'Page views', 'wp-piwik' ) . ':', $this->value( $response, 'nb_actions' ) . ' (Ø ' . $this->value( $response, 'nb_actions_per_visit' ) . ')' ), + array( __( 'Total time spent', 'wp-piwik' ) . ':', $time . ' (Ø ' . $avg_time . ')' ), + array( __( 'Bounce count', 'wp-piwik' ) . ':', $this->value( $response, 'bounce_count' ) . ' (' . $this->value( $response, 'bounce_rate' ) . ')' ) + ); + if ( ! in_array( $this->parameter['date'], array( 'last30', 'last60', 'last90' ), true ) ) { + array_push( $table_body, array( __( 'Time/visit', 'wp-piwik' ) . ':', $avg_time ), array( __( 'Max. page views in one visit', 'wp-piwik' ) . ':', $this->value( $response, 'max_actions' ) ) ); + } + $table_foot = self::$settings->get_global_option( 'piwik_shortcut' ) + ? array( + esc_html__( 'Shortcut', 'wp-piwik' ) . ':', + 'Matomo', + ) + : null; + $this->table( $table_head, $table_body, $table_foot ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php new file mode 100644 index 00000000..d5745e2f --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Pages.php @@ -0,0 +1,20 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Pages', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'Actions.getPageTitles'; + $this->name = __( 'Page', 'wp-piwik' ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php new file mode 100644 index 00000000..0f6193a0 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Plugins.php @@ -0,0 +1,40 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Plugins', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'DevicePlugins.getPlugin'; + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Plugin', 'wp-piwik' ), __( 'Visits', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + $table_body = array(); + $count = 0; + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $table_body[] = array( $row['label'], $row['nb_visits'], $row['nb_visits_percentage'] ); + if ( 10 === $count ) { + break; + } + } + } + $this->table( $table_head, $table_body, null ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php new file mode 100644 index 00000000..7f59cd48 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Post.php @@ -0,0 +1,95 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => isset( $params['period'] ) ? $params['period'] : $time_settings['period'], + 'date' => isset( $params['date'] ) ? $params['date'] : $time_settings['date'], + 'key' => isset( $params['key'] ) ? $params['key'] : null, + 'pageUrl' => isset( $params['url'] ) ? $params['url'] : get_permalink( $post->ID ), + 'description' => $time_settings['description'], + ); + $this->title = $prefix . esc_html__( 'Overview', 'wp-piwik' ) . ' (' . $this->parameter['date'] . ')'; + $this->method = 'Actions.getPageUrl'; + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + if ( in_array( $this->parameter['date'], array( 'last30', 'last60', 'last90' ), true ) ) { + $result = array(); + if ( is_array( $response ) ) { + foreach ( $response as $data ) { + if ( isset( $data[0] ) ) { + foreach ( $data[0] as $key => $value ) { + if ( isset( $result[ $key ] ) && is_numeric( $value ) ) { + $result[ $key ] += $value; + } elseif ( is_numeric( $value ) ) { + $result[ $key ] = $value; + } else { + $result[ $key ] = 0; + } + } + } + } + if ( isset( $result['nb_visits'] ) && $result['nb_visits'] > 0 ) { + $result['nb_actions_per_visit'] = round( ( isset( $result['nb_actions'] ) ? $result['nb_actions'] : 0 ) / $result['nb_visits'], 1 ); + $result['bounce_rate'] = round( ( isset( $result['bounce_count'] ) ? $result['bounce_count'] : 0 ) / $result['nb_visits'] * 100, 1 ) . '%'; + $result['avg_time_on_site'] = round( ( isset( $result['sum_visit_length'] ) ? $result['sum_visit_length'] : 0 ) / $result['nb_visits'], 0 ); + } else { + $result['nb_actions_per_visit'] = 0; + $result['bounce_rate'] = 0; + $result['avg_time_on_site'] = 0; + } + } + $response = $result; + } else { + if ( isset( $response[0] ) ) { + $response = $response[0]; + } + if ( $this->parameter['key'] ) { + $this->out( isset( $response[ $this->parameter['key'] ] ) ? esc_html( $response[ $this->parameter['key'] ] ) : 'not defined' ); + return; + } + } + $time = isset( $response['sum_visit_length'] ) ? $this->time_format( $response['sum_visit_length'] ) : '-'; + $avg_time = isset( $response['avg_time_on_site'] ) ? $this->time_format( $response['avg_time_on_site'] ) : '-'; + $table_head = null; + $table_body = array( array( __( 'Visitors', 'wp-piwik' ) . ':', $this->value( $response, 'nb_visits' ) ) ); + if ( '-' !== $this->value( $response, 'nb_uniq_visitors' ) ) { + array_push( $table_body, array( __( 'Unique visitors', 'wp-piwik' ) . ':', $this->value( $response, 'nb_uniq_visitors' ) ) ); + } elseif ( '-' !== $this->value( $response, 'sum_daily_nb_uniq_visitors' ) ) { + array_push( $table_body, __( 'Unique visitors', 'wp-piwik' ) . ':', $this->value( $response, 'sum_daily_nb_uniq_visitors' ) ); + } + array_push( + $table_body, + array( __( 'Page views', 'wp-piwik' ) . ':', $this->value( $response, 'nb_hits' ) . ' (Ø ' . $this->value( $response, 'entry_nb_actions' ) . ')' ), + array( __( 'Total time spent', 'wp-piwik' ) . ':', $time ), + array( __( 'Bounce count', 'wp-piwik' ) . ':', $this->value( $response, 'entry_bounce_count' ) . ' (' . $this->value( $response, 'bounce_rate' ) . ')' ), + array( __( 'Time/visit', 'wp-piwik' ) . ':', $avg_time ), + array( __( 'Min. generation time', 'wp-piwik' ) . ':', $this->value( $response, 'min_time_generation' ) ), + array( __( 'Max. generation time', 'wp-piwik' ) . ':', $this->value( $response, 'max_time_generation' ) ) + ); + if ( ! in_array( $this->parameter['date'], array( 'last30', 'last60', 'last90' ), true ) ) { + array_push( $table_body, array( __( 'Time/visit', 'wp-piwik' ) . ':', $avg_time ), array( __( 'Max. page views in one visit', 'wp-piwik' ) . ':', $this->value( $response, 'max_actions' ) ) ); + } + $table_foot = self::$settings->get_global_option( 'piwik_shortcut' ) + ? array( + esc_html__( 'Shortcut', 'wp-piwik' ) . ':', + 'Piwik', + ) + : null; + $this->table( $table_head, $table_body, $table_foot ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php new file mode 100644 index 00000000..148c6d35 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Referrers.php @@ -0,0 +1,20 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Referrers', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'Referrers.getWebsites'; + $this->name = 'Referrer'; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php new file mode 100644 index 00000000..1762ad8a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Screens.php @@ -0,0 +1,77 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Resolutions', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'Resolution.getResolution'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Resolution', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php new file mode 100644 index 00000000..b6f0bbdf --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Search.php @@ -0,0 +1,40 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Site Search', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'Actions.getSiteSearchKeywords'; + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Keyword', 'wp-piwik' ), __( 'Requests', 'wp-piwik' ), __( 'Bounced', 'wp-piwik' ) ); + $table_body = array(); + $count = 0; + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $table_body[] = array( $row['label'], $row['nb_visits'], $row['bounce_rate'] ); + if ( 10 === $count ) { + break; + } + } + } + $this->table( $table_head, $table_body, null ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php new file mode 100644 index 00000000..c2709290 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Seo.php @@ -0,0 +1,33 @@ +parameter = array( + 'url' => get_bloginfo( 'url' ), + ); + $this->title = $prefix . __( 'SEO', 'wp-piwik' ); + $this->method = 'SEO.getRank'; + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + echo '
'; + if ( is_array( $response ) ) { + foreach ( $response as $val ) { + echo ''; + } + } else { + echo ''; + } + echo '
' . ( isset( $val['logo_link'] ) && ! empty( $val['logo_link'] ) ? '' . esc_html( $val['label'] ) . '' : esc_html( $val['label'] ) ) . '' . esc_html( $val['rank'] ) . '
SEO module currently not available.
'; + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php new file mode 100644 index 00000000..15f62d42 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/SystemDetails.php @@ -0,0 +1,76 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Operation System Details', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'DevicesDetection.getOsVersions'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Operation System', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php new file mode 100644 index 00000000..00dbe8d0 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Systems.php @@ -0,0 +1,76 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Operation Systems', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'DevicesDetection.getOsFamilies'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Operation System', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + ++$count; + $sum += isset( $row[ $unique ] ) ? $row[ $unique ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $unique ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $unique ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $unique ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php new file mode 100644 index 00000000..cbe56f51 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Types.php @@ -0,0 +1,84 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => $time_settings['period'], + 'date' => $time_settings['date'], + ); + $this->title = $prefix . __( 'Types', 'wp-piwik' ) . ' (' . $time_settings['description'] . ')'; + $this->method = 'DevicesDetection.getType'; + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function show() { + $response = self::$wp_piwik->request( $this->api_id[ $this->method ] ); + $table_body = array(); + if ( ! empty( $response['result'] ) && 'error' === $response['result'] ) { + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $response['message'] ); + } else { + $table_head = array( __( 'Type', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Percent', 'wp-piwik' ) ); + if ( isset( $response[0]['nb_uniq_visitors'] ) ) { + $unique = 'nb_uniq_visitors'; + } else { + $unique = 'sum_daily_nb_uniq_visitors'; + } + $count = 0; + $sum = 0; + $js = array(); + $css_class = array(); + if ( is_array( $response ) ) { + foreach ( $response as $row ) { + $key = isset( $row[ $unique ] ) ? $unique : 'nb_visits'; + ++$count; + $sum += isset( $row[ $key ] ) ? $row[ $key ] : 0; + if ( $count < $this->limit ) { + $table_body[ $row['label'] ] = array( $row['label'], $row[ $key ], 0 ); + } elseif ( ! isset( $table_body['Others'] ) ) { + $table_body['Others'] = array( $row['label'], $row[ $key ], 0 ); + $css_class['Others'] = 'wp-piwik-hideDetails'; + $js['Others'] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $key ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } else { + $table_body['Others'][1] += $row[ $key ]; + $table_body[ $row['label'] ] = array( $row['label'], $row[ $key ], 0 ); + $css_class[ $row['label'] ] = 'wp-piwik-hideDetails hidden'; + $js[ $row['label'] ] = '$j' . "( '.wp-piwik-hideDetails' ).toggle( 'hidden' );"; + } + } + } + if ( $count > $this->limit ) { + $table_body['Others'][0] = __( 'Others', 'wp-piwik' ); + } elseif ( $count === $this->limit ) { + $css_class['Others'] = ''; + $js['Others'] = ''; + } + + foreach ( $table_body as $key => $row ) { + $table_body[ $key ][2] = number_format( $row[1] / $sum * 100, 2 ) . '%'; + } + + if ( ! empty( $table_body ) ) { + $this->pie_chart( $table_body ); + } + $this->table( $table_head, $table_body, null, false, $js, $css_class ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php new file mode 100644 index 00000000..0c320f1c --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/classes/WP_Piwik/Widget/Visitors.php @@ -0,0 +1,100 @@ +get_time_settings(); + $this->parameter = array( + 'idSite' => self::$wp_piwik->get_piwik_site_id( $this->blog_id ), + 'period' => isset( $params['period'] ) ? $params['period'] : $time_settings['period'], + 'date' => 'last' . ( 'day' === $time_settings['period'] ? '30' : '12' ), + 'limit' => null, + ); + $this->title = $prefix . __( 'Visitors', 'wp-piwik' ) . ' (' . $this->range_name() . ')'; + $this->method = array( 'VisitsSummary.getVisits', 'VisitsSummary.getUniqueVisitors', 'VisitsSummary.getBounceCount', 'VisitsSummary.getActions' ); + $this->context = 'normal'; + + $version = self::$wp_piwik->get_plugin_version(); + wp_enqueue_script( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'js/wp-piwik.js', array(), $version, true ); + wp_enqueue_script( 'wp-piwik-chartjs', self::$wp_piwik->get_plugin_url() . 'js/chartjs/chart.min.js', array(), $version, false ); + wp_enqueue_style( 'wp-piwik', self::$wp_piwik->get_plugin_url() . 'css/wp-piwik.css', array(), $version ); + } + + public function request_data() { + $response = array(); + $success = true; + foreach ( $this->method as $method ) { + $response[ $method ] = self::$wp_piwik->request( $this->api_id[ $method ] ); + if ( ! empty( $response[ $method ]['result'] ) && 'error' === $response[ $method ]['result'] ) { + $success = false; + } + } + return array( + 'response' => $response, + 'success' => $success, + ); + } + + public function show() { + $result = $this->request_data(); + $response = $result['response']; + if ( ! $result['success'] ) { + $message = ''; + if ( is_array( $this->method ) ) { + foreach ( $this->method as $m ) { + if ( empty( $response[ $m ]['message'] ) ) { + continue; + } + + $message .= ' ' . $m . ' - ' . $response[ $m ]['message']; + } + } else { + $message = $response[ $this->method ]['message']; + } + + echo '' . esc_html__( 'Piwik error', 'wp-piwik' ) . ': ' . esc_html( $message ); + } else { + $data = array(); + if ( is_array( $response ) && is_array( $response['VisitsSummary.getVisits'] ) ) { + foreach ( $response['VisitsSummary.getVisits'] as $key => $value ) { + if ( 'week' === $this->parameter['period'] ) { + preg_match( '/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/', $key, $date_list ); + $js_key = $date_list[0]; + $text_key = $this->date_format( $js_key, 'week' ); + } elseif ( 'month' === $this->parameter['period'] ) { + $js_key = $key . '-01'; + $text_key = $key; + } else { + $js_key = $key; + $text_key = $key; + } + $data[] = array( + $text_key, + $value, + $response['VisitsSummary.getUniqueVisitors'][ $key ] ? $response['VisitsSummary.getUniqueVisitors'][ $key ] : '-', + $response['VisitsSummary.getBounceCount'][ $key ] ? $response['VisitsSummary.getBounceCount'][ $key ] : '-', + $response['VisitsSummary.getActions'][ $key ] ? $response['VisitsSummary.getActions'][ $key ] : '-', + ); + $java_script[] = 'javascript:wp_piwik_datelink(' + . wp_json_encode( rawurlencode( 'wp-piwik_stats' ) ) . ',' + . wp_json_encode( str_replace( '-', '', $js_key ) ) . ',' + . wp_json_encode( isset( $_GET['wpmu_show_stats'] ) ? (int) $_GET['wpmu_show_stats'] : '' ) + . ');'; + } + } + $this->table( + array( __( 'Date', 'wp-piwik' ), __( 'Visits', 'wp-piwik' ), __( 'Unique', 'wp-piwik' ), __( 'Bounced', 'wp-piwik' ), __( 'Page Views', 'wp-piwik' ) ), + array_reverse( $data ), + array(), + 'clickable', + array_reverse( isset( $java_script ) ? $java_script : array() ) + ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.json b/wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.json new file mode 100644 index 00000000..c2d808fc --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.json @@ -0,0 +1,20 @@ +{ + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.2", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "squizlabs/php_codesniffer": "^3.13", + "wp-coding-standards/wpcs": "^3.3", + "friendsofphp/php-cs-fixer": "^3.94" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true, + "phpstan/extension-installer": true + } + }, + "require-dev": { + "phpstan/phpstan": "^2.1", + "szepeviktor/phpstan-wordpress": "^2.0", + "phpstan/extension-installer": "^1.4" + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.lock b/wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.lock new file mode 100644 index 00000000..3c2dc066 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/composer.lock @@ -0,0 +1,3529 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "78837cf0ee62370f920471ab6c92f1da", + "packages": [ + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.2", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "^2.2", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "opensource@frenck.dev", + "homepage": "https://frenck.dev", + "role": "Open source developer" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", + "source": "https://github.com/PHPCSStandards/composer-installer" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-11T04:32:07+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.94.2", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7787ceff91365ba7d623ec410b8f429cdebb4f63", + "reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.3", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.5", + "ext-filter": "*", + "ext-hash": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.3", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.6", + "react/event-loop": "^1.5", + "react/socket": "^1.16", + "react/stream": "^1.4", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0", + "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.33", + "symfony/polyfill-php80": "^1.33", + "symfony/polyfill-php81": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0", + "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.7.1", + "infection/infection": "^0.32.3", + "justinrainbow/json-schema": "^6.6.4", + "keradus/cli-executor": "^2.3", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.7", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.7", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.51", + "symfony/polyfill-php85": "^1.33", + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.4", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.1" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/**/Internal/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.2" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2026-02-20T16:13:53+00:00" + }, + { + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + }, + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + } + ], + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2019-12-27T09:44:58+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-paragonie", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", + "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", + "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "paragonie/random_compat": "dev-master", + "paragonie/sodium_compat": "dev-master" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "paragonie", + "phpcs", + "polyfill", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "security": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/security/policy", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "funding": [ + { + "url": "https://github.com/PHPCompatibility", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcompatibility", + "type": "thanks_dev" + } + ], + "time": "2025-09-19T17:43:28+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-wp", + "version": "2.1.8", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", + "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/7c8d18b4d90dac9e86b0869a608fa09158e168fa", + "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/phpcompatibility-paragonie": "^1.0", + "squizlabs/php_codesniffer": "^3.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "funding": [ + { + "url": "https://github.com/PHPCompatibility", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcompatibility", + "type": "thanks_dev" + } + ], + "time": "2025-10-18T00:05:59+00:00" + }, + { + "name": "phpcsstandards/phpcsextra", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", + "reference": "b598aa890815b8df16363271b659d73280129101" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/b598aa890815b8df16363271b659d73280129101", + "reference": "b598aa890815b8df16363271b659d73280129101", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsutils": "^1.2.0", + "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcsstandards/phpcsdevcs": "^1.2.0", + "phpcsstandards/phpcsdevtools": "^1.2.1", + "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" + } + ], + "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", + "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSExtra" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-12T23:06:57+00:00" + }, + { + "name": "phpcsstandards/phpcsutils", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", + "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/c216317e96c8b3f5932808f9b0f1f7a14e3bbf55", + "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1" + }, + "require-dev": { + "ext-filter": "*", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcsstandards/phpcsdevcs": "^1.2.0", + "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0 || ^3.0.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPCSUtils/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + } + ], + "description": "A suite of utility functions for use with PHP_CodeSniffer", + "homepage": "https://phpcsutils.com/", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "phpcs3", + "phpcs4", + "standards", + "static analysis", + "tokens", + "utility" + ], + "support": { + "docs": "https://phpcsutils.com/", + "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", + "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSUtils" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-12-08T14:27:58+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.7", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.7" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-12-23T15:25:20+00:00" + }, + { + "name": "react/dns", + "version": "v1.14.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.14.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-18T19:34:28+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-17T20:46:25+00:00" + }, + { + "name": "react/promise", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-08-19T18:57:03+00:00" + }, + { + "name": "react/socket", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.17.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-19T20:47:34+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.13.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-04T16:30:35+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "49257c96304c508223815ee965c251e7c79e614e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/49257c96304c508223815ee965c251e7c79e614e", + "reference": "49257c96304c508223815ee965c251e7c79e614e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-06T13:31:08+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.32", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "99d7e101826e6610606b9433248f80c1997cd20b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99d7e101826e6610606b9433248f80c1997cd20b", + "reference": "99d7e101826e6610606b9433248f80c1997cd20b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.32" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T11:13:48+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.4.34", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/01ffe0411b842f93c571e5c391f289c3fdd498c3", + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.4.34" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-24T17:51:06+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.34", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.34" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-28T15:16:37+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", + "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T13:06:53+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.33", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "c46e854e79b52d07666e43924a20cb6dc546644e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/c46e854e79b52d07666e43924a20cb6dc546644e", + "reference": "c46e854e79b52d07666e43924a20cb6dc546644e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.33" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-23T16:02:12+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.24", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-10T08:14:14+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.34", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2adaf4106f2ef4c67271971bde6d3fe0a6936432", + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.4.34" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-08T20:44:54+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "7795ec6fa05663d716a549d0b44e47ffc8b0d4a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7795ec6fa05663d716a549d0b44e47ffc8b0d4a6", + "reference": "7795ec6fa05663d716a549d0b44e47ffc8b0d4a6", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-libxml": "*", + "ext-tokenizer": "*", + "ext-xmlreader": "*", + "php": ">=7.2", + "phpcsstandards/phpcsextra": "^1.5.0", + "phpcsstandards/phpcsutils": "^1.1.0", + "squizlabs/php_codesniffer": "^3.13.4" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcompatibility/php-compatibility": "^10.0.0@dev", + "phpcsstandards/phpcsdevtools": "^1.2.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "suggest": { + "ext-iconv": "For improved results", + "ext-mbstring": "For improved results" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/php_codesniffer", + "type": "custom" + } + ], + "time": "2025-11-25T12:08:04+00:00" + } + ], + "packages-dev": [ + { + "name": "php-stubs/wordpress-stubs", + "version": "v6.9.1", + "source": { + "type": "git", + "url": "https://github.com/php-stubs/wordpress-stubs.git", + "reference": "f12220f303e0d7c0844c0e5e957b0c3cee48d2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/f12220f303e0d7c0844c0e5e957b0c3cee48d2f7", + "reference": "f12220f303e0d7c0844c0e5e957b0c3cee48d2f7", + "shasum": "" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "5.6.1" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "nikic/php-parser": "^5.5", + "php": "^7.4 || ^8.0", + "php-stubs/generator": "^0.8.3", + "phpdocumentor/reflection-docblock": "^6.0", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^9.5", + "symfony/polyfill-php80": "*", + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.1.1", + "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" + }, + "suggest": { + "paragonie/sodium_compat": "Pure PHP implementation of libsodium", + "symfony/polyfill-php80": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WordPress function and class declaration stubs for static analysis.", + "homepage": "https://github.com/php-stubs/wordpress-stubs", + "keywords": [ + "PHPStan", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/php-stubs/wordpress-stubs/issues", + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.9.1" + }, + "time": "2026-02-03T19:29:21+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" + }, + "time": "2024-09-04T20:21:43+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.1.42", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1279e1ce86ba768f0780c9d889852b4e02ff40d0", + "reference": "1279e1ce86ba768f0780c9d889852b4e02ff40d0", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2026-03-17T14:58:32+00:00" + }, + { + "name": "szepeviktor/phpstan-wordpress", + "version": "v2.0.3", + "source": { + "type": "git", + "url": "https://github.com/szepeviktor/phpstan-wordpress.git", + "reference": "aa722f037b2d034828cd6c55ebe9e5c74961927e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/aa722f037b2d034828cd6c55ebe9e5c74961927e", + "reference": "aa722f037b2d034828cd6c55ebe9e5c74961927e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "php-stubs/wordpress-stubs": "^6.6.2", + "phpstan/phpstan": "^2.0" + }, + "require-dev": { + "composer/composer": "^2.1.14", + "composer/semver": "^3.4", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.0", + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.0", + "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" + }, + "suggest": { + "swissspidy/phpstan-no-private": "Detect usage of internal core functions, classes and methods" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "SzepeViktor\\PHPStan\\WordPress\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WordPress extensions for PHPStan", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/szepeviktor/phpstan-wordpress/issues", + "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v2.0.3" + }, + "time": "2025-09-14T02:58:22+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/config.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/config.php new file mode 100644 index 00000000..461ef615 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/config.php @@ -0,0 +1,11 @@ + + + + + + GNU General Public License - GNU Project - Free Software Foundation (FSF) + +

GNU GENERAL PUBLIC LICENSE

+

Version 3, 29 June 2007

+ +

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

+ Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed.

+ +

Preamble

+ +

The GNU General Public License is a free, copyleft license for +software and other kinds of works.

+ +

The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too.

+ +

When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things.

+ +

To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others.

+ +

For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights.

+ +

Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it.

+ +

For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions.

+ +

Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users.

+ +

Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free.

+ +

The precise terms and conditions for copying, distribution and +modification follow.

+ +

TERMS AND CONDITIONS

+ +

0. Definitions.

+ +

“This License” refers to version 3 of the GNU General Public License.

+ +

“Copyright” also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks.

+ +

“The Program” refers to any copyrightable work licensed under this +License. Each licensee is addressed as “you”. “Licensees” and +“recipients” may be individuals or organizations.

+ +

To “modify” a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a “modified version” of the +earlier work or a work “based on” the earlier work.

+ +

A “covered work” means either the unmodified Program or a work based +on the Program.

+ +

To “propagate” a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well.

+ +

To “convey” a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying.

+ +

An interactive user interface displays “Appropriate Legal Notices” +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion.

+ +

1. Source Code.

+ +

The “source code” for a work means the preferred form of the work +for making modifications to it. “Object code” means any non-source +form of a work.

+ +

A “Standard Interface” means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language.

+ +

The “System Libraries” of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +“Major Component”, in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it.

+ +

The “Corresponding Source” for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work.

+ +

The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source.

+ +

The Corresponding Source for a work in source code form is that +same work.

+ +

2. Basic Permissions.

+ +

All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law.

+ +

You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you.

+ +

Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary.

+ +

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

+ +

No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures.

+ +

When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures.

+ +

4. Conveying Verbatim Copies.

+ +

You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program.

+ +

You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee.

+ +

5. Conveying Modified Source Versions.

+ +

You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions:

+ +
    +
  • a) The work must carry prominent notices stating that you modified + it, and giving a relevant date.
  • + +
  • b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + “keep intact all notices”.
  • + +
  • c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it.
  • + +
  • d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so.
  • +
+ +

A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +“aggregate” if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate.

+ +

6. Conveying Non-Source Forms.

+ +

You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways:

+ +
    +
  • a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange.
  • + +
  • b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge.
  • + +
  • c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b.
  • + +
  • d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements.
  • + +
  • e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d.
  • +
+ +

A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work.

+ +

A “User Product” is either (1) a “consumer product”, which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, “normally used” refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product.

+ +

“Installation Information” for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made.

+ +

If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM).

+ +

The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network.

+ +

Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying.

+ +

7. Additional Terms.

+ +

“Additional permissions” are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions.

+ +

When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission.

+ +

Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms:

+ +
    +
  • a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or
  • + +
  • b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or
  • + +
  • c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or
  • + +
  • d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or
  • + +
  • e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or
  • + +
  • f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors.
  • +
+ +

All other non-permissive additional terms are considered “further +restrictions” within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying.

+ +

If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms.

+ +

Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way.

+ +

8. Termination.

+ +

You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11).

+ +

However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation.

+ +

Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice.

+ +

Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10.

+ +

9. Acceptance Not Required for Having Copies.

+ +

You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so.

+ +

10. Automatic Licensing of Downstream Recipients.

+ +

Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License.

+ +

An “entity transaction” is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts.

+ +

You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it.

+ +

11. Patents.

+ +

A “contributor” is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's “contributor version”.

+ +

A contributor's “essential patent claims” are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, “control” includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License.

+ +

Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version.

+ +

In the following three paragraphs, a “patent license” is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To “grant” such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party.

+ +

If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. “Knowingly relying” means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid.

+ +

If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it.

+ +

A patent license is “discriminatory” if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007.

+ +

Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law.

+ +

12. No Surrender of Others' Freedom.

+ +

If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program.

+ +

13. Use with the GNU Affero General Public License.

+ +

Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such.

+ +

14. Revised Versions of this License.

+ +

The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns.

+ +

Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License “or any later version” applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation.

+ +

If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program.

+ +

Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version.

+ +

15. Disclaimer of Warranty.

+ +

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

+ +

16. Limitation of Liability.

+ +

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES.

+ +

17. Interpretation of Sections 15 and 16.

+ +

If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee.

+ +

END OF TERMS AND CONDITIONS

+ +

How to Apply These Terms to Your New Programs

+ +

If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms.

+ +

To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the “copyright” line and a pointer to where the full notice is found.

+ +
    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ +

Also add information on how to contact you by electronic and paper mail.

+ +

If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode:

+ +
    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+ +

The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an “about box”.

+ +

You should also get your employer (if you work as a programmer) or school, +if any, to sign a “copyright disclaimer” for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>.

+ +

The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>.

+ + + \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/index.php b/wp-content/upgrade-temp-backup/plugins/wp-piwik/index.php new file mode 100644 index 00000000..b3d9bbc7 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/index.php @@ -0,0 +1 @@ + +
+ Simple yet flexible JavaScript charting for designers & developers +

+ +

+ Downloads + GitHub Workflow Status + Coverage + Awesome + Slack +

+ +## Documentation + +All the links point to the new version 3 of the lib. + +* [Introduction](https://www.chartjs.org/docs/latest/) +* [Getting Started](https://www.chartjs.org/docs/latest/getting-started/index) +* [General](https://www.chartjs.org/docs/latest/general/data-structures) +* [Configuration](https://www.chartjs.org/docs/latest/configuration/index) +* [Charts](https://www.chartjs.org/docs/latest/charts/line) +* [Axes](https://www.chartjs.org/docs/latest/axes/index) +* [Developers](https://www.chartjs.org/docs/latest/developers/index) +* [Popular Extensions](https://github.com/chartjs/awesome) +* [Samples](https://www.chartjs.org/samples/) + +In case you are looking for the docs of version 2, you will have to specify the specific version in the url like this: [https://www.chartjs.org/docs/2.9.4/](https://www.chartjs.org/docs/2.9.4/) + +## Contributing + +Instructions on building and testing Chart.js can be found in [the documentation](https://www.chartjs.org/docs/master/developers/contributing.html#building-and-testing). Before submitting an issue or a pull request, please take a moment to look over the [contributing guidelines](https://www.chartjs.org/docs/master/developers/contributing) first. For support, please post questions on [Stack Overflow](https://stackoverflow.com/questions/tagged/chartjs) with the `chartjs` tag. + +## License + +Chart.js is available under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/js/chartjs/chart.min.js b/wp-content/upgrade-temp-backup/plugins/wp-piwik/js/chartjs/chart.min.js new file mode 100644 index 00000000..b982f045 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/js/chartjs/chart.min.js @@ -0,0 +1,13 @@ +/*! + * Chart.js v3.4.1 + * https://www.chartjs.org + * (c) 2021 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";const t="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function e(e,i,n){const o=n||(t=>Array.prototype.slice.call(t));let s=!1,a=[];return function(...n){a=o(n),s||(s=!0,t.call(window,(()=>{s=!1,e.apply(i,a)})))}}function i(t,e){let i;return function(){return e?(clearTimeout(i),i=setTimeout(t,e)):t(),e}}const n=t=>"start"===t?"left":"end"===t?"right":"center",o=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,s=(t,e,i,n)=>t===(n?"left":"right")?i:"center"===t?(e+i)/2:e;var a=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,n){const o=e.listeners[n],s=e.duration;o.forEach((n=>n({chart:t,initial:e.initial,numSteps:s,currentStep:Math.min(i-e.start,s)})))}_refresh(){const e=this;e._request||(e._running=!0,e._request=t.call(window,(()=>{e._update(),e._request=null,e._running&&e._refresh()})))}_update(t=Date.now()){const e=this;let i=0;e._charts.forEach(((n,o)=>{if(!n.running||!n.items.length)return;const s=n.items;let a,r=s.length-1,l=!1;for(;r>=0;--r)a=s[r],a._active?(a._total>n.duration&&(n.duration=a._total),a.tick(t),l=!0):(s[r]=s[s.length-1],s.pop());l&&(o.draw(),e._notify(o,n,t,"progress")),s.length||(n.running=!1,e._notify(o,n,t,"complete"),n.initial=!1),i+=s.length})),e._lastDate=t,0===i&&(e._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}; +/*! + * @kurkle/color v0.1.9 + * https://github.com/kurkle/color#readme + * (c) 2020 Jukka Kurkela + * Released under the MIT License + */const r={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},l="0123456789ABCDEF",c=t=>l[15&t],h=t=>l[(240&t)>>4]+l[15&t],d=t=>(240&t)>>4==(15&t);function u(t){var e=function(t){return d(t.r)&&d(t.g)&&d(t.b)&&d(t.a)}(t)?c:h;return t?"#"+e(t.r)+e(t.g)+e(t.b)+(t.a<255?e(t.a):""):t}function f(t){return t+.5|0}const g=(t,e,i)=>Math.max(Math.min(t,i),e);function p(t){return g(f(2.55*t),0,255)}function m(t){return g(f(255*t),0,255)}function x(t){return g(f(t/2.55)/100,0,1)}function b(t){return g(f(100*t),0,100)}const _=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const y=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function v(t,e,i){const n=e*Math.min(i,1-i),o=(e,o=(e+t/30)%12)=>i-n*Math.max(Math.min(o-3,9-o,1),-1);return[o(0),o(8),o(4)]}function w(t,e,i){const n=(n,o=(n+t/60)%6)=>i-i*e*Math.max(Math.min(o,4-o,1),0);return[n(5),n(3),n(1)]}function M(t,e,i){const n=v(t,1,.5);let o;for(e+i>1&&(o=1/(e+i),e*=o,i*=o),o=0;o<3;o++)n[o]*=1-e-i,n[o]+=e;return n}function k(t){const e=t.r/255,i=t.g/255,n=t.b/255,o=Math.max(e,i,n),s=Math.min(e,i,n),a=(o+s)/2;let r,l,c;return o!==s&&(c=o-s,l=a>.5?c/(2-o-s):c/(o+s),r=o===e?(i-n)/c+(i>16&255,s>>8&255,255&s]}return t}(),A.transparent=[0,0,0,0]);const e=A[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}function R(t,e,i){if(t){let n=k(t);n[e]=Math.max(0,Math.min(n[e]+n[e]*i,0===e?360:1)),n=P(n),t.r=n[0],t.g=n[1],t.b=n[2]}}function E(t,e){return t?Object.assign(e||{},t):t}function z(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=m(t[3]))):(e=E(t,{r:0,g:0,b:0,a:1})).a=m(e.a),e}function I(t){return"r"===t.charAt(0)?function(t){const e=_.exec(t);let i,n,o,s=255;if(e){if(e[7]!==i){const t=+e[7];s=255&(e[8]?p(t):255*t)}return i=+e[1],n=+e[3],o=+e[5],i=255&(e[2]?p(i):i),n=255&(e[4]?p(n):n),o=255&(e[6]?p(o):o),{r:i,g:n,b:o,a:s}}}(t):C(t)}class F{constructor(t){if(t instanceof F)return t;const e=typeof t;let i;var n,o,s;"object"===e?i=z(t):"string"===e&&(s=(n=t).length,"#"===n[0]&&(4===s||5===s?o={r:255&17*r[n[1]],g:255&17*r[n[2]],b:255&17*r[n[3]],a:5===s?17*r[n[4]]:255}:7!==s&&9!==s||(o={r:r[n[1]]<<4|r[n[2]],g:r[n[3]]<<4|r[n[4]],b:r[n[5]]<<4|r[n[6]],a:9===s?r[n[7]]<<4|r[n[8]]:255})),i=o||L(t)||I(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=E(this._rgb);return t&&(t.a=x(t.a)),t}set rgb(t){this._rgb=z(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${x(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):this._rgb;var t}hexString(){return this._valid?u(this._rgb):this._rgb}hslString(){return this._valid?function(t){if(!t)return;const e=k(t),i=e[0],n=b(e[1]),o=b(e[2]);return t.a<255?`hsla(${i}, ${n}%, ${o}%, ${x(t.a)})`:`hsl(${i}, ${n}%, ${o}%)`}(this._rgb):this._rgb}mix(t,e){const i=this;if(t){const n=i.rgb,o=t.rgb;let s;const a=e===s?.5:e,r=2*a-1,l=n.a-o.a,c=((r*l==-1?r:(r+l)/(1+r*l))+1)/2;s=1-c,n.r=255&c*n.r+s*o.r+.5,n.g=255&c*n.g+s*o.g+.5,n.b=255&c*n.b+s*o.b+.5,n.a=a*n.a+(1-a)*o.a,i.rgb=n}return i}clone(){return new F(this.rgb)}alpha(t){return this._rgb.a=m(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=f(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return R(this._rgb,2,t),this}darken(t){return R(this._rgb,2,-t),this}saturate(t){return R(this._rgb,1,t),this}desaturate(t){return R(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=k(t);i[0]=D(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function B(t){return new F(t)}const V=t=>t instanceof CanvasGradient||t instanceof CanvasPattern;function W(t){return V(t)?t:B(t)}function N(t){return V(t)?t:B(t).saturate(.5).darken(.1).hexString()}function H(){}const j=function(){let t=0;return function(){return t++}}();function $(t){return null==t}function Y(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)}function U(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const X=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function q(t,e){return X(t)?t:e}function K(t,e){return void 0===t?e:t}const G=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,Z=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function Q(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function J(t,e,i,n){let o,s,a;if(Y(t))if(s=t.length,n)for(o=s-1;o>=0;o--)e.call(i,t[o],o);else for(o=0;oi;)t=t[e.substr(i,n-i)],i=n+1,n=rt(e,i);return t}function ct(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ht=t=>void 0!==t,dt=t=>"function"==typeof t,ut=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0},ft=Object.create(null),gt=Object.create(null);function pt(t,e){if(!e)return t;const i=e.split(".");for(let e=0,n=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>N(e.backgroundColor),this.hoverBorderColor=(t,e)=>N(e.borderColor),this.hoverColor=(t,e)=>N(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.describe(t)}set(t,e){return mt(this,t,e)}get(t){return pt(this,t)}describe(t,e){return mt(gt,t,e)}override(t,e){return mt(ft,t,e)}route(t,e,i,n){const o=pt(this,t),s=pt(this,i),a="_"+e;Object.defineProperties(o,{[a]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=s[n];return U(t)?Object.assign({},e,t):K(t,e)},set(t){this[a]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});const bt=Math.PI,_t=2*bt,yt=_t+bt,vt=Number.POSITIVE_INFINITY,wt=bt/180,Mt=bt/2,kt=bt/4,St=2*bt/3,Pt=Math.log10,Dt=Math.sign;function Ct(t){const e=Math.round(t);t=At(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(Pt(t))),n=t/i;return(n<=1?1:n<=2?2:n<=5?5:10)*i}function Ot(t){const e=[],i=Math.sqrt(t);let n;for(n=1;nt-e)).pop(),e}function Tt(t){return!isNaN(parseFloat(t))&&isFinite(t)}function At(t,e,i){return Math.abs(t-e)=t}function Rt(t,e,i){let n,o,s;for(n=0,o=t.length;nl&&cn&&(n=s),n}function Ut(t,e,i,n){let o=(n=n||{}).data=n.data||{},s=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(o=n.data={},s=n.garbageCollect=[],n.font=e),t.save(),t.font=e;let a=0;const r=i.length;let l,c,h,d,u;for(l=0;li.length){for(l=0;l0&&t.stroke()}}function Gt(t,e,i){return i=i||.5,t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==s.strokeColor;let l,c;for(t.save(),t.font=o.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);$(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,s),l=0;lt[i]1;)n=s+o>>1,i(n)?s=n:o=n;return{lo:s,hi:o}}const se=(t,e,i)=>oe(t,i,(n=>t[n][e]oe(t,i,(n=>t[n][e]>=i));function re(t,e,i){let n=0,o=t.length;for(;nn&&t[o-1]>i;)o--;return n>0||o{const i="_onData"+ct(e),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const o=n.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),o}})})))}function he(t,e){const i=t._chartjs;if(!i)return;const n=i.listeners,o=n.indexOf(e);-1!==o&&n.splice(o,1),n.length>0||(le.forEach((e=>{delete t[e]})),delete t._chartjs)}function de(t){const e=new Set;let i,n;for(i=0,n=t.length;iwindow.getComputedStyle(t,null);function pe(t,e){return ge(t).getPropertyValue(e)}const me=["top","right","bottom","left"];function xe(t,e,i){const n={};i=i?"-"+i:"";for(let o=0;o<4;o++){const s=me[o];n[s]=parseFloat(t[e+"-"+s+i])||0}return n.width=n.left+n.right,n.height=n.top+n.bottom,n}function be(t,e){const{canvas:i,currentDevicePixelRatio:n}=e,o=ge(i),s="border-box"===o.boxSizing,a=xe(o,"padding"),r=xe(o,"border","width"),{x:l,y:c,box:h}=function(t,e){const i=t.native||t,n=i.touches,o=n&&n.length?n[0]:i,{offsetX:s,offsetY:a}=o;let r,l,c=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(s,a,i.target))r=s,l=a;else{const t=e.getBoundingClientRect();r=o.clientX-t.left,l=o.clientY-t.top,c=!0}return{x:r,y:l,box:c}}(t,i),d=a.left+(h&&r.left),u=a.top+(h&&r.top);let{width:f,height:g}=e;return s&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/n),y:Math.round((c-u)/g*i.height/n)}}const _e=t=>Math.round(10*t)/10;function ye(t,e,i,n){const o=ge(t),s=xe(o,"margin"),a=fe(o.maxWidth,t,"clientWidth")||vt,r=fe(o.maxHeight,t,"clientHeight")||vt,l=function(t,e,i){let n,o;if(void 0===e||void 0===i){const s=ue(t);if(s){const t=s.getBoundingClientRect(),a=ge(s),r=xe(a,"border","width"),l=xe(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,n=fe(a.maxWidth,s,"clientWidth"),o=fe(a.maxHeight,s,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:n||vt,maxHeight:o||vt}}(t,e,i);let{width:c,height:h}=l;if("content-box"===o.boxSizing){const t=xe(o,"border","width"),e=xe(o,"padding");c-=e.width+t.width,h-=e.height+t.height}return c=Math.max(0,c-s.width),h=Math.max(0,n?Math.floor(c/n):h-s.height),c=_e(Math.min(c,a,l.maxWidth)),h=_e(Math.min(h,r,l.maxHeight)),c&&!h&&(h=_e(c/2)),{width:c,height:h}}function ve(t,e,i){const n=e||1,o=Math.floor(t.height*n),s=Math.floor(t.width*n);t.height=o/n,t.width=s/n;const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==n||a.height!==o||a.width!==s)&&(t.currentDevicePixelRatio=n,a.height=o,a.width=s,t.ctx.setTransform(n,0,0,n,0,0),!0)}const we=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Me(t,e){const i=pe(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}function ke(t,e){return"native"in t?{x:t.x,y:t.y}:be(t,e)}function Se(t,e,i,n){const{controller:o,data:s,_sorted:a}=t,r=o._cachedMeta.iScale;if(r&&e===r.axis&&a&&s.length){const t=r._reversePixels?ae:se;if(!n)return t(s,e,i);if(o._sharedOptions){const n=s[0],o="function"==typeof n.getRange&&n.getRange(e);if(o){const n=t(s,e,i-o),a=t(s,e,i+o);return{lo:n.lo,hi:a.hi}}}}return{lo:0,hi:s.length-1}}function Pe(t,e,i,n,o){const s=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=s.length;t{t[r](o[a],n)&&s.push({element:t,datasetIndex:e,index:i}),t.inRange(o.x,o.y,n)&&(l=!0)})),i.intersect&&!l?[]:s}var Te={modes:{index(t,e,i,n){const o=ke(e,t),s=i.axis||"x",a=i.intersect?De(t,o,s,n):Ce(t,o,s,!1,n),r=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&r.push({element:i,datasetIndex:t.index,index:e})})),r):[]},dataset(t,e,i,n){const o=ke(e,t),s=i.axis||"xy";let a=i.intersect?De(t,o,s,n):Ce(t,o,s,!1,n);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;tDe(t,ke(e,t),i.axis||"xy",n),nearest:(t,e,i,n)=>Ce(t,ke(e,t),i.axis||"xy",i.intersect,n),x:(t,e,i,n)=>(i.axis="x",Oe(t,e,i,n)),y:(t,e,i,n)=>(i.axis="y",Oe(t,e,i,n))}};const Ae=new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),Le=new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);function Re(t,e){const i=(""+t).match(Ae);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function Ee(t,e){const i={},n=U(e),o=n?Object.keys(e):e,s=U(t)?n?i=>K(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of o)i[t]=+s(t)||0;return i}function ze(t){return Ee(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Ie(t){return Ee(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Fe(t){const e=ze(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Be(t,e){t=t||{},e=e||xt.font;let i=K(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let n=K(t.style,e.style);n&&!(""+n).match(Le)&&(console.warn('Invalid font style specified: "'+n+'"'),n="");const o={family:K(t.family,e.family),lineHeight:Re(K(t.lineHeight,e.lineHeight),i),size:i,style:n,weight:K(t.weight,e.weight),string:""};return o.string=$t(o),o}function Ve(t,e,i,n){let o,s,a,r=!0;for(o=0,s=t.length;ot.pos===e))}function je(t,e){return t.filter((t=>-1===Ne.indexOf(t.pos)&&t.box.axis===e))}function $e(t,e){return t.sort(((t,i)=>{const n=e?i:t,o=e?t:i;return n.weight===o.weight?n.index-o.index:n.weight-o.weight}))}function Ye(t,e,i,n){return Math.max(t[i],e[i])+Math.max(t[n],e[n])}function Ue(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Xe(t,e,i){const n=i.box,o=t.maxPadding;U(i.pos)||(i.size&&(t[i.pos]-=i.size),i.size=i.horizontal?n.height:n.width,t[i.pos]+=i.size),n.getPadding&&Ue(o,n.getPadding());const s=Math.max(0,e.outerWidth-Ye(o,t,"left","right")),a=Math.max(0,e.outerHeight-Ye(o,t,"top","bottom")),r=s!==t.w,l=a!==t.h;return t.w=s,t.h=a,i.horizontal?{same:r,other:l}:{same:l,other:r}}function qe(t,e){const i=e.maxPadding;function n(t){const n={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{n[t]=Math.max(e[t],i[t])})),n}return n(t?["left","right"]:["top","bottom"])}function Ke(t,e,i){const n=[];let o,s,a,r,l,c;for(o=0,s=t.length,l=0;ot.box.fullSize)),!0),n=$e(He(e,"left"),!0),o=$e(He(e,"right")),s=$e(He(e,"top"),!0),a=$e(He(e,"bottom")),r=je(e,"x"),l=je(e,"y");return{fullSize:i,leftAndTop:n.concat(s),rightAndBottom:o.concat(l).concat(a).concat(r),chartArea:He(e,"chartArea"),vertical:n.concat(o).concat(l),horizontal:s.concat(a).concat(r)}}(t.boxes),l=r.vertical,c=r.horizontal;J(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const h=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:o,availableWidth:s,availableHeight:a,vBoxMaxWidth:s/2/h,hBoxMaxHeight:a/2}),u=Object.assign({},o);Ue(u,Fe(n));const f=Object.assign({maxPadding:u,w:s,h:a,x:o.left,y:o.top},o);!function(t,e){let i,n,o;for(i=0,n=t.length;i{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h)}))}};class Qe{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}}class Je extends Qe{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}}const ti={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ei=t=>null===t||""===t;const ii=!!we&&{passive:!0};function ni(t,e,i){t.canvas.removeEventListener(e,i,ii)}function oi(t,e,i){const n=t.canvas,o=n&&ue(n)||n,s=new MutationObserver((t=>{const e=ue(o);t.forEach((t=>{for(let n=0;n{t.forEach((t=>{for(let e=0;e{i.currentDevicePixelRatio!==t&&e()})))}function ci(t,i,n){const o=t.canvas,s=o&&ue(o);if(!s)return;const a=e(((t,e)=>{const i=s.clientWidth;n(t,e),i{const e=t[0],i=e.contentRect.width,n=e.contentRect.height;0===i&&0===n||a(i,n)}));return r.observe(s),function(t,e){ai.size||window.addEventListener("resize",li),ai.set(t,e)}(t,a),r}function hi(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){ai.delete(t),ai.size||window.removeEventListener("resize",li)}(t)}function di(t,i,n){const o=t.canvas,s=e((e=>{null!==t.ctx&&n(function(t,e){const i=ti[t.type]||t.type,{x:n,y:o}=be(t,e);return{type:i,chart:e,native:t,x:void 0!==n?n:null,y:void 0!==o?o:null}}(e,t))}),t,(t=>{const e=t[0];return[e,e.offsetX,e.offsetY]}));return function(t,e,i){t.addEventListener(e,i,ii)}(o,i,s),s}class ui extends Qe{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,n=t.getAttribute("height"),o=t.getAttribute("width");if(t.$chartjs={initial:{height:n,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ei(o)){const e=Me(t,"width");void 0!==e&&(t.width=e)}if(ei(n))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Me(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;["height","width"].forEach((t=>{const n=i[t];$(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const n=t.$proxies||(t.$proxies={}),o={attach:oi,detach:si,resize:ci}[e]||di;n[e]=o(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),n=i[e];if(!n)return;({attach:hi,detach:hi,resize:hi}[e]||ni)(t,e,n),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return ye(t,e,i,n)}isAttached(t){const e=ue(t);return!(!e||!ue(e))}}var fi=Object.freeze({__proto__:null,BasePlatform:Qe,BasicPlatform:Je,DomPlatform:ui});const gi=t=>0===t||1===t,pi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*_t/i),mi=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*_t/i)+1,xi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*Mt),easeOutSine:t=>Math.sin(t*Mt),easeInOutSine:t=>-.5*(Math.cos(bt*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>gi(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>gi(t)?t:pi(t,.075,.3),easeOutElastic:t=>gi(t)?t:mi(t,.075,.3),easeInOutElastic(t){const e=.1125;return gi(t)?t:t<.5?.5*pi(2*t,e,.45):.5+.5*mi(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-xi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*xi.easeInBounce(2*t):.5*xi.easeOutBounce(2*t-1)+.5},bi="transparent",_i={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const n=W(t||bi),o=n.valid&&W(e||bi);return o&&o.valid?o.mix(n,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class yi{constructor(t,e,i,n){const o=e[i];n=Ve([t.to,n,o,t.from]);const s=Ve([t.from,o,n]);this._active=!0,this._fn=t.fn||_i[t.type||typeof s],this._easing=xi[t.easing]||xi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=s,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){const n=this;if(n._active){n._notify(!1);const o=n._target[n._prop],s=i-n._start,a=n._duration-s;n._start=i,n._duration=Math.floor(Math.max(a,t.duration)),n._total+=s,n._loop=!!t.loop,n._to=Ve([t.to,e,o,t.from]),n._from=Ve([t.from,o,e])}}cancel(){const t=this;t._active&&(t.tick(Date.now()),t._active=!1,t._notify(!1))}tick(t){const e=this,i=t-e._start,n=e._duration,o=e._prop,s=e._from,a=e._loop,r=e._to;let l;if(e._active=s!==r&&(a||i1?2-l:l,l=e._easing(Math.min(1,Math.max(0,l))),e._target[o]=e._fn(s,r,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),xt.set("animations",{colors:{type:"color",properties:["color","borderColor","backgroundColor"]},numbers:{type:"number",properties:["x","y","borderWidth","radius","tension"]}}),xt.describe("animations",{_fallback:"animation"}),xt.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}});class wi{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!U(t))return;const e=this._properties;Object.getOwnPropertyNames(t).forEach((i=>{const n=t[i];if(!U(n))return;const o={};for(const t of vi)o[t]=n[t];(Y(n.properties)&&n.properties||[i]).forEach((t=>{t!==i&&e.has(t)||e.set(t,o)}))}))}_animateOptions(t,e){const i=e.options,n=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!n)return[];const o=this._createAnimations(n,i);return i.$shared&&function(t,e){const i=[],n=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),o}_createAnimations(t,e){const i=this._properties,n=[],o=t.$animations||(t.$animations={}),s=Object.keys(e),a=Date.now();let r;for(r=s.length-1;r>=0;--r){const l=s[r];if("$"===l.charAt(0))continue;if("options"===l){n.push(...this._animateOptions(t,e));continue}const c=e[l];let h=o[l];const d=i.get(l);if(h){if(d&&h.active()){h.update(d,c,a);continue}h.cancel()}d&&d.duration?(o[l]=h=new yi(d,t,l,c),n.push(h)):t[l]=c}return n}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(a.add(this._chart,i),!0):void 0}}function Mi(t,e){const i=t&&t.options||{},n=i.reverse,o=void 0===i.min?e:0,s=void 0===i.max?e:0;return{start:n?s:o,end:n?o:s}}function ki(t,e){const i=[],n=t._getSortedDatasetMetas(e);let o,s;for(o=0,s=n.length;o0||!i&&e<0)return n.index}return null}function Oi(t,e){const{chart:i,_cachedMeta:n}=t,o=i._stacks||(i._stacks={}),{iScale:s,vScale:a,index:r}=n,l=s.axis,c=a.axis,h=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(s,a,n),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Ai(t,e){const i=t.vScale&&t.vScale.axis;if(i){e=e||t._parsed;for(const n of e){const e=n._stacks;if(!e||void 0===e[i]||void 0===e[i][t.index])return;delete e[i][t.index]}}}const Li=t=>"reset"===t||"none"===t,Ri=(t,e)=>e?t:Object.assign({},t);class Ei{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){const t=this,e=t._cachedMeta;t.configure(),t.linkScales(),e._stacked=Pi(e.vScale,e),t.addElements()}updateIndex(t){this.index!==t&&Ai(this._cachedMeta),this.index=t}linkScales(){const t=this,e=t.chart,i=t._cachedMeta,n=t.getDataset(),o=(t,e,i,n)=>"x"===t?e:"r"===t?n:i,s=i.xAxisID=K(n.xAxisID,Ti(e,"x")),a=i.yAxisID=K(n.yAxisID,Ti(e,"y")),r=i.rAxisID=K(n.rAxisID,Ti(e,"r")),l=i.indexAxis,c=i.iAxisID=o(l,s,a,r),h=i.vAxisID=o(l,a,s,r);i.xScale=t.getScaleForId(s),i.yScale=t.getScaleForId(a),i.rScale=t.getScaleForId(r),i.iScale=t.getScaleForId(c),i.vScale=t.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&he(this._data,this),t._stacked&&Ai(t)}_dataCheck(){const t=this,e=t.getDataset(),i=e.data||(e.data=[]),n=t._data;if(U(i))t._data=function(t){const e=Object.keys(t),i=new Array(e.length);let n,o,s;for(n=0,o=e.length;n0&&n._parsed[t-1];if(!1===i._parsing)n._parsed=o,n._sorted=!0,h=o;else{h=Y(o[t])?i.parseArrayData(n,o,t,e):U(o[t])?i.parseObjectData(n,o,t,e):i.parsePrimitiveData(n,o,t,e);const s=()=>null===c[r]||u&&c[r]p||d=0;--u)if(!m()){i.updateRangeFromParsed(c,t,g,l);break}return c}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let n,o,s;for(n=0,o=e.length;n=0&&tn.getContext(i,o)),d);return g.$shared&&(g.$shared=l,s[a]=Object.freeze(Ri(g,l))),g}_resolveAnimations(t,e,i){const n=this,o=n.chart,s=n._cachedDataOpts,a=`animation-${e}`,r=s[a];if(r)return r;let l;if(!1!==o.options.animation){const o=n.chart.config,s=o.datasetAnimationScopeKeys(n._type,e),a=o.getOptionScopes(n.getDataset(),s);l=o.createResolver(a,n.getContext(t,i,e))}const c=new wi(o,l&&l.animations);return l&&l._cacheable&&(s[a]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Li(t)||this.chart._animationsDisabled}updateElement(t,e,i,n){Li(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!Li(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;const o=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this,i=e._data,n=e._cachedMeta.data;for(const[t,i,n]of e._syncList)e[t](i,n);e._syncList=[];const o=n.length,s=i.length,a=Math.min(s,o);a&&e.parse(0,a),s>o?e._insertElements(o,s-o,t):s{for(t.length+=e,r=t.length-1;r>=a;r--)t[r]=t[r-e]};for(l(s),r=t;r{o[t]=n[t]&&n[t].active()?n[t]._to:i[t]})),o}}zi.defaults={},zi.defaultRoutes=void 0;const Ii=new Map;function Fi(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let n=Ii.get(i);return n||(n=new Intl.NumberFormat(t,e),Ii.set(i,n)),n}(e,i).format(t)}const Bi={values:t=>Y(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const n=this.chart.options.locale;let o,s=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(o="scientific"),s=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=Pt(Math.abs(s)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:o,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Fi(t,n,l)},logarithmic(t,e,i){if(0===t)return"0";const n=t/Math.pow(10,Math.floor(Pt(t)));return 1===n||2===n||5===n?Bi.numeric.call(this,t,e,i):""}};var Vi={formatters:Bi};function Wi(t,e){const i=t.options.ticks,n=i.maxTicksLimit||function(t){const e=t.options.offset,i=t._tickSize(),n=t._length/i+(e?0:1),o=t._maxLength/i;return Math.floor(Math.min(n,o))}(t),o=i.major.enabled?function(t){const e=[];let i,n;for(i=0,n=t.length;in)return function(t,e,i,n){let o,s=0,a=i[0];for(n=Math.ceil(n),o=0;oo)return e}return Math.max(o,1)}(o,e,n);if(s>0){let t,i;const n=s>1?Math.round((r-a)/(s-1)):null;for(Ni(e,l,c,$(n)?0:a-n,a),t=0,i=s-1;te.lineWidth,tickColor:(t,e)=>e.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Vi.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),xt.route("scale.ticks","color","","color"),xt.route("scale.grid","color","","borderColor"),xt.route("scale.grid","borderColor","","borderColor"),xt.route("scale.title","color","","color"),xt.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t}),xt.describe("scales",{_fallback:"scale"}),xt.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t});const Hi=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i;function ji(t,e){const i=[],n=t.length/e,o=t.length;let s=0;for(;sa+r)))return c}function Yi(t){return t.drawTicks?t.tickLength:0}function Ui(t,e){if(!t.display)return 0;const i=Be(t.font,e),n=Fe(t.padding);return(Y(t.text)?t.text.length:1)*i.lineHeight+n.height}function Xi(t,e,i){let o=n(t);return(i&&"right"!==e||!i&&"right"===e)&&(o=(t=>"left"===t?"right":"right"===t?"left":t)(o)),o}class qi extends zi{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){const e=this;e.options=t.setContext(e.getContext()),e.axis=t.axis,e._userMin=e.parse(t.min),e._userMax=e.parse(t.max),e._suggestedMin=e.parse(t.suggestedMin),e._suggestedMax=e.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:n}=this;return t=q(t,Number.POSITIVE_INFINITY),e=q(e,Number.NEGATIVE_INFINITY),i=q(i,Number.POSITIVE_INFINITY),n=q(n,Number.NEGATIVE_INFINITY),{min:q(t,i),max:q(e,n),minDefined:X(t),maxDefined:X(e)}}getMinMax(t){const e=this;let i,{min:n,max:o,minDefined:s,maxDefined:a}=e.getUserBounds();if(s&&a)return{min:n,max:o};const r=e.getMatchingVisibleMetas();for(let l=0,c=r.length;l=s||n<=1||!t.isHorizontal())return void(t.labelRotation=o);const h=t._getLabelSizes(),d=h.widest.width,u=h.highest.height,f=Ht(t.chart.width-d,0,t.maxWidth);a=e.offset?t.maxWidth/n:f/(n-1),d+6>a&&(a=f/(n-(e.offset?.5:1)),r=t.maxHeight-Yi(e.grid)-i.padding-Ui(e.title,t.chart.options.font),l=Math.sqrt(d*d+u*u),c=zt(Math.min(Math.asin(Math.min((h.highest.height+6)/a,1)),Math.asin(Math.min(r/l,1))-Math.asin(u/l))),c=Math.max(o,Math.min(s,c))),t.labelRotation=c}afterCalculateLabelRotation(){Q(this.options.afterCalculateLabelRotation,[this])}beforeFit(){Q(this.options.beforeFit,[this])}fit(){const t=this,e={width:0,height:0},{chart:i,options:{ticks:n,title:o,grid:s}}=t,a=t._isVisible(),r=t.isHorizontal();if(a){const a=Ui(o,i.options.font);if(r?(e.width=t.maxWidth,e.height=Yi(s)+a):(e.height=t.maxHeight,e.width=Yi(s)+a),n.display&&t.ticks.length){const{first:i,last:o,widest:s,highest:a}=t._getLabelSizes(),l=2*n.padding,c=Et(t.labelRotation),h=Math.cos(c),d=Math.sin(c);if(r){const i=n.mirror?0:d*s.width+h*a.height;e.height=Math.min(t.maxHeight,e.height+i+l)}else{const i=n.mirror?0:h*s.width+d*a.height;e.width=Math.min(t.maxWidth,e.width+i+l)}t._calculatePadding(i,o,d,h)}}t._handleMargins(),r?(t.width=t._length=i.width-t._margins.left-t._margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=i.height-t._margins.top-t._margins.bottom)}_calculatePadding(t,e,i,n){const o=this,{ticks:{align:s,padding:a},position:r}=o.options,l=0!==o.labelRotation,c="top"!==r&&"x"===o.axis;if(o.isHorizontal()){const r=o.getPixelForTick(0)-o.left,h=o.right-o.getPixelForTick(o.ticks.length-1);let d=0,u=0;l?c?(d=n*t.width,u=i*e.height):(d=i*t.height,u=n*e.width):"start"===s?u=e.width:"end"===s?d=t.width:(d=t.width/2,u=e.width/2),o.paddingLeft=Math.max((d-r+a)*o.width/(o.width-r),0),o.paddingRight=Math.max((u-h+a)*o.width/(o.width-h),0)}else{let i=e.height/2,n=t.height/2;"start"===s?(i=0,n=t.height):"end"===s&&(i=e.height,n=0),o.paddingTop=i+a,o.paddingBottom=n+a}}_handleMargins(){const t=this;t._margins&&(t._margins.left=Math.max(t.paddingLeft,t._margins.left),t._margins.top=Math.max(t.paddingTop,t._margins.top),t._margins.right=Math.max(t.paddingRight,t._margins.right),t._margins.bottom=Math.max(t.paddingBottom,t._margins.bottom))}afterFit(){Q(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){const e=this;let i,n;for(e.beforeTickToLabelConversion(),e.generateTickLabels(t),i=0,n=t.length;i{const i=t.gc,n=i.length/2;let o;if(n>e){for(o=0;o({width:o[t]||0,height:s[t]||0});return{first:v(0),last:v(e-1),widest:v(_),highest:v(y),widths:o,heights:s}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){const e=this;e._reversePixels&&(t=1-t);const i=e._startPixel+t*e._length;return jt(e._alignToPixels?Xt(e.chart,i,0):i)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this,i=e.ticks||[];if(t>=0&&tr*o?r/n:l/o:l*o0}_computeGridLineItems(t){const e=this,i=e.axis,n=e.chart,o=e.options,{grid:s,position:a}=o,r=s.offset,l=e.isHorizontal(),c=e.ticks.length+(r?1:0),h=Yi(s),d=[],u=s.setContext(e.getContext()),f=u.drawBorder?u.borderWidth:0,g=f/2,p=function(t){return Xt(n,t,f)};let m,x,b,_,y,v,w,M,k,S,P,D;if("top"===a)m=p(e.bottom),v=e.bottom-h,M=m-g,S=p(t.top)+g,D=t.bottom;else if("bottom"===a)m=p(e.top),S=t.top,D=p(t.bottom)-g,v=m+g,M=e.top+h;else if("left"===a)m=p(e.right),y=e.right-h,w=m-g,k=p(t.left)+g,P=t.right;else if("right"===a)m=p(e.left),k=t.left,P=p(t.right)-g,y=m+g,w=e.left+h;else if("x"===i){if("center"===a)m=p((t.top+t.bottom)/2+.5);else if(U(a)){const t=Object.keys(a)[0],i=a[t];m=p(e.chart.scales[t].getPixelForValue(i))}S=t.top,D=t.bottom,v=m+g,M=v+h}else if("y"===i){if("center"===a)m=p((t.left+t.right)/2);else if(U(a)){const t=Object.keys(a)[0],i=a[t];m=p(e.chart.scales[t].getPixelForValue(i))}y=m-g,w=y-h,k=t.left,P=t.right}const C=K(o.ticks.maxTicksLimit,c),O=Math.max(1,Math.ceil(c/C));for(x=0;xe.value===t));if(n>=0){return i.setContext(e.getContext(n)).lineWidth}return 0}drawGrid(t){const e=this,i=e.options.grid,n=e.ctx,o=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));let s,a;const r=(t,e,i)=>{i.width&&i.color&&(n.save(),n.lineWidth=i.width,n.strokeStyle=i.color,n.setLineDash(i.borderDash||[]),n.lineDashOffset=i.borderDashOffset,n.beginPath(),n.moveTo(t.x,t.y),n.lineTo(e.x,e.y),n.stroke(),n.restore())};if(i.display)for(s=0,a=o.length;st[0])){ht(n)||(n=rn("_fallback",t));const s={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:n,_getTarget:o,override:o=>Ki([o,...t],e,i,n)};return new Proxy(s,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,n)=>tn(i,n,(()=>function(t,e,i,n){let o;for(const s of e)if(o=rn(Qi(s,t),i),ht(o))return Ji(t,o)?sn(i,n,t,o):o}(n,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ln(t).includes(e),ownKeys:t=>ln(t),set:(t,e,i)=>((t._storage||(t._storage=o()))[e]=i,delete t[e],delete t._keys,!0)})}function Gi(t,e,i,n){const o={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Zi(t,n),setContext:e=>Gi(t,e,i,n),override:o=>Gi(t.override(o),e,i,n)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>tn(t,e,(()=>function(t,e,i){const{_proxy:n,_context:o,_subProxy:s,_descriptors:a}=t;let r=n[e];dt(r)&&a.isScriptable(e)&&(r=function(t,e,i,n){const{_proxy:o,_context:s,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t),e=e(s,a||n),r.delete(t),U(e)&&(e=sn(o._scopes,o,t,e));return e}(e,r,t,i));Y(r)&&r.length&&(r=function(t,e,i,n){const{_proxy:o,_context:s,_subProxy:a,_descriptors:r}=i;if(ht(s.index)&&n(t))e=e[s.index%e.length];else if(U(e[0])){const i=e,n=o._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=sn(n,o,t,l);e.push(Gi(i,s,a&&a[t],r))}}return e}(e,r,t,a.isIndexable));Ji(e,r)&&(r=Gi(r,o,s&&s[e],a));return r}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,n)=>(t[i]=n,delete e[i],!0)})}function Zi(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:n=e.indexable,_allKeys:o=e.allKeys}=t;return{allKeys:o,scriptable:i,indexable:n,isScriptable:dt(i)?i:()=>i,isIndexable:dt(n)?n:()=>n}}const Qi=(t,e)=>t?t+ct(e):e,Ji=(t,e)=>U(e)&&"adapters"!==t;function tn(t,e,i){let n=t[e];return ht(n)||(n=i(),ht(n)&&(t[e]=n)),n}function en(t,e,i){return dt(t)?t(e,i):t}const nn=(t,e)=>!0===t?e:"string"==typeof t?lt(e,t):void 0;function on(t,e,i,n){for(const o of e){const e=nn(i,o);if(e){t.add(e);const o=en(e._fallback,i,e);if(ht(o)&&o!==i&&o!==n)return o}else if(!1===e&&ht(n)&&i!==n)return null}return!1}function sn(t,e,i,n){const o=e._rootScopes,s=en(e._fallback,i,n),a=[...t,...o],r=new Set;r.add(n);let l=an(r,a,i,s||i);return null!==l&&((!ht(s)||s===i||(l=an(r,a,s,l),null!==l))&&Ki(Array.from(r),[""],o,s,(()=>function(t,e,i){const n=t._getTarget();e in n||(n[e]={});const o=n[e];if(Y(o)&&U(i))return i;return o}(e,i,n))))}function an(t,e,i,n){for(;i;)i=on(t,e,i,n);return i}function rn(t,e){for(const i of e){if(!i)continue;const e=i[t];if(ht(e))return e}}function ln(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}const cn=Number.EPSILON||1e-14,hn=(t,e)=>e"x"===t?"y":"x";function un(t,e,i,n){const o=t.skip?e:t,s=e,a=i.skip?e:i,r=Bt(s,o),l=Bt(a,s);let c=r/(r+l),h=l/(r+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;const d=n*c,u=n*h;return{previous:{x:s.x-d*(a.x-o.x),y:s.y-d*(a.y-o.y)},next:{x:s.x+u*(a.x-o.x),y:s.y+u*(a.y-o.y)}}}function fn(t,e="x"){const i=dn(e),n=t.length,o=Array(n).fill(0),s=Array(n);let a,r,l,c=hn(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)fn(t,o);else{let i=n?t[t.length-1]:t[0];for(s=0,a=t.length;s0?e.y:t.y}}function bn(t,e,i,n){const o={x:t.cp2x,y:t.cp2y},s={x:e.cp1x,y:e.cp1y},a=mn(t,o,i),r=mn(o,s,i),l=mn(s,e,i),c=mn(a,r,i),h=mn(r,l,i);return mn(c,h,i)}function _n(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function yn(t,e){let i,n;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,n=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=n)}function vn(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function wn(t){return"angle"===t?{between:Nt,compare:Vt,normalize:Wt}:{between:(t,e,i)=>t>=Math.min(e,i)&&t<=Math.max(i,e),compare:(t,e)=>t-e,normalize:t=>t}}function Mn({start:t,end:e,count:i,loop:n,style:o}){return{start:t%i,end:e%i,loop:n&&(e-t+1)%i==0,style:o}}function kn(t,e,i){if(!i)return[t];const{property:n,start:o,end:s}=i,a=e.length,{compare:r,between:l,normalize:c}=wn(n),{start:h,end:d,loop:u,style:f}=function(t,e,i){const{property:n,start:o,end:s}=i,{between:a,normalize:r}=wn(n),l=e.length;let c,h,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,c=0,h=l;cb||l(o,x,p)&&0!==r(o,x),v=()=>!b||0===r(s,p)||l(s,x,p);for(let t=h,i=h;t<=d;++t)m=e[t%a],m.skip||(p=c(m[n]),p!==x&&(b=l(p,o,s),null===_&&y()&&(_=0===r(p,o)?t:i),null!==_&&v()&&(g.push(Mn({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Mn({start:_,end:d,loop:u,count:a,style:f})),g}function Sn(t,e){const i=[],n=t.segments;for(let o=0;oo&&t[s%e].skip;)s--;return s%=e,{start:o,end:s}}(i,o,s,n);if(!0===n)return Dn([{start:a,end:r,loop:s}],i,e);return Dn(function(t,e,i,n){const o=t.length,s=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%o];i.skip||i.stop?l.skip||(n=!1,s.push({start:e%o,end:(a-1)%o,loop:n}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&s.push({start:e%o,end:r%o,loop:n}),s}(i,a,r{const n=i.split("."),o=n.pop(),s=[t].concat(n).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");xt.route(s,o,l,r)}))}(e,t.defaultRoutes);t.descriptors&&xt.describe(e,t.descriptors)}(t,a,n),e.override&&xt.override(t.id,t.overrides)),a}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,n=this.scope;i in e&&delete e[i],n&&i in xt[n]&&(delete xt[n][i],this.override&&delete ft[i])}}var Ln=new class{constructor(){this.controllers=new An(Ei,"datasets",!0),this.elements=new An(zi,"elements"),this.plugins=new An(Object,"plugins"),this.scales=new An(qi,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){const n=this;[...e].forEach((e=>{const o=i||n._getRegistryForType(e);i||o.isForType(e)||o===n.plugins&&e.id?n._exec(t,o,e):J(e,(e=>{const o=i||n._getRegistryForType(e);n._exec(t,o,e)}))}))}_exec(t,e,i){const n=ct(t);Q(i["before"+n],[],i),e[t](i),Q(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}}function En(t,e){return e||!1!==t?!0===t?{}:t:null}function zn(t,e,i,n){const o=t.pluginScopeKeys(e),s=t.getOptionScopes(i,o);return t.createResolver(s,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function In(t,e){const i=xt.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Fn(t,e){return"x"===t||"y"===t?t:e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.charAt(0).toLowerCase();var i}function Bn(t){const e=t.options||(t.options={});e.plugins=K(e.plugins,{}),e.scales=function(t,e){const i=ft[t.type]||{scales:{}},n=e.scales||{},o=In(t.type,e),s=Object.create(null),a=Object.create(null);return Object.keys(n).forEach((t=>{const e=n[t],r=Fn(t,e),l=function(t,e){return t===e?"_index_":"_value_"}(r,o),c=i.scales||{};s[r]=s[r]||t,a[t]=st(Object.create(null),[{axis:r},e,c[r],c[l]])})),t.data.datasets.forEach((i=>{const o=i.type||t.type,r=i.indexAxis||In(o,e),l=(ft[o]||{}).scales||{};Object.keys(l).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,r),o=i[e+"AxisID"]||s[e]||e;a[o]=a[o]||Object.create(null),st(a[o],[{axis:e},n[o],l[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];st(e,[xt.scales[e.type],xt.scale])})),a}(t,e)}function Vn(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const Wn=new Map,Nn=new Set;function Hn(t,e){let i=Wn.get(t);return i||(i=e(),Wn.set(t,i),Nn.add(i)),i}const jn=(t,e,i)=>{const n=lt(e,i);void 0!==n&&t.add(n)};class $n{constructor(t){this._config=function(t){return(t=t||{}).data=Vn(t.data),Bn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Vn(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Bn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Hn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return Hn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return Hn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return Hn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let n=i.get(t);return n&&!e||(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){const{options:n,type:o}=this,s=this._cachedScopes(t,i),a=s.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>jn(r,t,e)))),e.forEach((t=>jn(r,n,t))),e.forEach((t=>jn(r,ft[o]||{},t))),e.forEach((t=>jn(r,xt,t))),e.forEach((t=>jn(r,gt,t)))}));const l=Array.from(r);return Nn.has(e)&&s.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,ft[e]||{},xt.datasets[e]||{},{type:e},xt,gt]}resolveNamedOptions(t,e,i,n=[""]){const o={$shared:!0},{resolver:s,subPrefixes:a}=Yn(this._resolverCache,t,n);let r=s;if(function(t,e){const{isScriptable:i,isIndexable:n}=Zi(t);for(const o of e)if(i(o)&&dt(t[o])||n(o)&&Y(t[o]))return!0;return!1}(s,e)){o.$shared=!1;r=Gi(s,i=dt(i)?i():i,this.createResolver(t,i,a))}for(const t of e)o[t]=r[t];return o}createResolver(t,e,i=[""],n){const{resolver:o}=Yn(this._resolverCache,t,i);return U(e)?Gi(o,e,void 0,n):o}}function Yn(t,e,i){let n=t.get(e);n||(n=new Map,t.set(e,n));const o=i.join();let s=n.get(o);if(!s){s={resolver:Ki(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},n.set(o,s)}return s}const Un=["top","bottom","left","right","chartArea"];function Xn(t,e){return"top"===t||"bottom"===t||-1===Un.indexOf(t)&&"x"===e}function qn(t,e){return function(i,n){return i[t]===n[t]?i[e]-n[e]:i[t]-n[t]}}function Kn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Q(i&&i.onComplete,[t],e)}function Gn(t){const e=t.chart,i=e.options.animation;Q(i&&i.onProgress,[t],e)}function Zn(){return"undefined"!=typeof window&&"undefined"!=typeof document}function Qn(t){return Zn()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Jn={},to=t=>{const e=Qn(t);return Object.values(Jn).filter((t=>t.canvas===e)).pop()};class eo{constructor(t,e){const n=this;this.config=e=new $n(e);const o=Qn(t),s=to(o);if(s)throw new Error("Canvas is already in use. Chart with ID '"+s.id+"' must be destroyed before the canvas can be reused.");const r=e.createResolver(e.chartOptionScopes(),n.getContext());this.platform=n._initializePlatform(o,e);const l=n.platform.acquireContext(o,r.aspectRatio),c=l&&l.canvas,h=c&&c.height,d=c&&c.width;this.id=j(),this.ctx=l,this.canvas=c,this.width=d,this.height=h,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this.scale=void 0,this._plugins=new Rn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=i((()=>this.update("resize")),r.resizeDelay||0),Jn[n.id]=n,l&&c?(a.listen(n,"complete",Kn),a.listen(n,"progress",Gn),n._initialize(),n.attached&&n.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return $(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){const t=this;return t.notifyPlugins("beforeInit"),t.options.responsive?t.resize():ve(t,t.options.devicePixelRatio),t.bindEvents(),t.notifyPlugins("afterInit"),t}_initializePlatform(t,e){return e.platform?new e.platform:!Zn()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?new Je:new ui}clear(){return qt(this.canvas,this.ctx),this}stop(){return a.stop(this),this}resize(t,e){a.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this,n=i.options,o=i.canvas,s=n.maintainAspectRatio&&i.aspectRatio,a=i.platform.getMaximumSize(o,t,e,s),r=n.devicePixelRatio||i.platform.getDevicePixelRatio();i.width=a.width,i.height=a.height,i._aspectRatio=i.aspectRatio,ve(i,r,!0)&&(i.notifyPlugins("resize",{size:a}),Q(n.onResize,[i,a],i),i.attached&&i._doResize()&&i.render())}ensureScalesHaveIDs(){J(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this,e=t.options,i=e.scales,n=t.scales,o=Object.keys(n).reduce(((t,e)=>(t[e]=!1,t)),{});let s=[];i&&(s=s.concat(Object.keys(i).map((t=>{const e=i[t],n=Fn(t,e),o="r"===n,s="x"===n;return{options:e,dposition:o?"chartArea":s?"bottom":"left",dtype:o?"radialLinear":s?"category":"linear"}})))),J(s,(i=>{const s=i.options,a=s.id,r=Fn(a,s),l=K(s.type,i.dtype);void 0!==s.position&&Xn(s.position,r)===Xn(i.dposition)||(s.position=i.dposition),o[a]=!0;let c=null;if(a in n&&n[a].type===l)c=n[a];else{c=new(Ln.getScale(l))({id:a,type:l,ctx:t.ctx,chart:t}),n[c.id]=c}c.init(s,e)})),J(o,((t,e)=>{t||delete n[e]})),J(n,(e=>{Ze.configure(t,e,e.options),Ze.addBox(t,e)}))}_updateMetasets(){const t=this,e=t._metasets,i=t.data.datasets.length,n=e.length;if(e.sort(((t,e)=>t.index-e.index)),n>i){for(let e=i;ei.length&&delete t._stacks,e.forEach(((e,n)=>{0===i.filter((t=>t===e._dataset)).length&&t._destroyDatasetMeta(n)}))}buildOrUpdateControllers(){const t=this,e=[],i=t.data.datasets;let n,o;for(t._removeUnreferencedMetasets(),n=0,o=i.length;n{t.getDatasetMeta(i).controller.reset()}),t)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this,i=e.config;i.update(),e._options=i.createResolver(i.chartOptionScopes(),e.getContext()),J(e.scales,(t=>{Ze.removeBox(e,t)}));const n=e._animationsDisabled=!e.options.animation;e.ensureScalesHaveIDs(),e.buildOrUpdateScales();const o=new Set(Object.keys(e._listeners)),s=new Set(e.options.events);if(ut(o,s)&&!!this._responsiveListeners===e.options.responsive||(e.unbindEvents(),e.bindEvents()),e._plugins.invalidate(),!1===e.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const a=e.buildOrUpdateControllers();e.notifyPlugins("beforeElementsUpdate");let r=0;for(let t=0,i=e.data.datasets.length;t{t.reset()})),e._updateDatasets(t),e.notifyPlugins("afterUpdate",{mode:t}),e._layers.sort(qn("z","_idx")),e._lastEvent&&e._eventHandler(e._lastEvent,!0),e.render()}_updateLayout(t){const e=this;if(!1===e.notifyPlugins("beforeLayout",{cancelable:!0}))return;Ze.update(e,e.width,e.height,t);const i=e.chartArea,n=i.width<=0||i.height<=0;e._layers=[],J(e.boxes,(t=>{n&&"chartArea"===t.position||(t.configure&&t.configure(),e._layers.push(...t._layers()))}),e),e._layers.forEach(((t,e)=>{t._idx=e})),e.notifyPlugins("afterLayout")}_updateDatasets(t){const e=this,i="function"==typeof t;if(!1!==e.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let n=0,o=e.data.datasets.length;n=0;--i)t._drawDataset(e[i]);t.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this,i=e.ctx,n=t._clip,o=!n.disabled,s=e.chartArea,a={meta:t,index:t.index,cancelable:!0};!1!==e.notifyPlugins("beforeDatasetDraw",a)&&(o&&Zt(i,{left:!1===n.left?0:s.left-n.left,right:!1===n.right?e.width:s.right+n.right,top:!1===n.top?0:s.top-n.top,bottom:!1===n.bottom?e.height:s.bottom+n.bottom}),t.controller.draw(),o&&Qt(i),a.cancelable=!1,e.notifyPlugins("afterDatasetDraw",a))}getElementsAtEventForMode(t,e,i,n){const o=Te.modes[e];return"function"==typeof o?o(this,t,i,n):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let n=i.filter((t=>t&&t._dataset===e)).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}getContext(){return this.$context||(this.$context={chart:this,type:"chart"})}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateDatasetVisibility(t,e){const i=this,n=e?"show":"hide",o=i.getDatasetMeta(t),s=o.controller._resolveAnimations(void 0,n);i.setDatasetVisibility(t,e),s.update(o,{visible:e}),i.update((e=>e.datasetIndex===t?n:void 0))}hide(t){this._updateDatasetVisibility(t,!1)}show(t){this._updateDatasetVisibility(t,!0)}_destroyDatasetMeta(t){const e=this,i=e._metasets&&e._metasets[t];i&&i.controller&&(i.controller._destroy(),delete e._metasets[t])}destroy(){const t=this,{canvas:e,ctx:i}=t;let n,o;for(t.stop(),a.remove(t),n=0,o=t.data.datasets.length;n((n,o)=>{i.addEventListener(t,n,o),e[n]=o})(o,n)))}bindResponsiveEvents(){const t=this;t._responsiveListeners||(t._responsiveListeners={});const e=t._responsiveListeners,i=t.platform,n=(n,o)=>{i.addEventListener(t,n,o),e[n]=o},o=(n,o)=>{e[n]&&(i.removeEventListener(t,n,o),delete e[n])},s=(e,i)=>{t.canvas&&t.resize(e,i)};let a;const r=()=>{o("attach",r),t.attached=!0,t.resize(),n("resize",s),n("detach",a)};a=()=>{t.attached=!1,o("resize",s),n("attach",r)},i.isAttached(t.canvas)?r():a()}unbindEvents(){const t=this;J(t._listeners,((e,i)=>{t.platform.removeEventListener(t,i,e)})),t._listeners={},J(t._responsiveListeners,((e,i)=>{t.platform.removeEventListener(t,i,e)})),t._responsiveListeners=void 0}updateHoverStyle(t,e,i){const n=i?"set":"remove";let o,s,a,r;for("dataset"===e&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),a=0,r=t.length;a{const n=e.getDatasetMeta(t);if(!n)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:n.data[i],index:i}}));!tt(n,i)&&(e._active=n,e._updateHoverStyles(n,i))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){const n=this,o=n.options.hover,s=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),a=s(e,t),r=i?t:s(t,e);a.length&&n.updateHoverStyle(a,o.mode,!1),r.length&&o.mode&&n.updateHoverStyle(r,o.mode,!0)}_eventHandler(t,e){const i=this,n={event:t,replay:e,cancelable:!0},o=e=>(e.options.events||this.options.events).includes(t.type);if(!1===i.notifyPlugins("beforeEvent",n,o))return;const s=i._handleEvent(t,e);return n.cancelable=!1,i.notifyPlugins("afterEvent",n,o),(s||n.changed)&&i.render(),i}_handleEvent(t,e){const i=this,{_active:n=[],options:o}=i,s=o.hover,a=e;let r=[],l=!1,c=null;return"mouseout"!==t.type&&(r=i.getElementsAtEventForMode(t,s.mode,s,a),c="click"===t.type?i._lastEvent:t),i._lastEvent=null,Gt(t,i.chartArea,i._minPadding)&&(Q(o.onHover,[t,r,i],i),"mouseup"!==t.type&&"click"!==t.type&&"contextmenu"!==t.type||Q(o.onClick,[t,r,i],i)),l=!tt(r,n),(l||e)&&(i._active=r,i._updateHoverStyles(r,n,e)),i._lastEvent=c,l}}const io=()=>J(eo.instances,(t=>t._plugins.invalidate())),no=!0;function oo(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}Object.defineProperties(eo,{defaults:{enumerable:no,value:xt},instances:{enumerable:no,value:Jn},overrides:{enumerable:no,value:ft},registry:{enumerable:no,value:Ln},version:{enumerable:no,value:"3.4.1"},getChart:{enumerable:no,value:to},register:{enumerable:no,value:(...t)=>{Ln.add(...t),io()}},unregister:{enumerable:no,value:(...t)=>{Ln.remove(...t),io()}}});class so{constructor(t){this.options=t||{}}formats(){return oo()}parse(t,e){return oo()}format(t,e){return oo()}add(t,e,i){return oo()}diff(t,e,i){return oo()}startOf(t,e,i){return oo()}endOf(t,e){return oo()}}so.override=function(t){Object.assign(so.prototype,t)};var ao={_date:so};function ro(t){const e=function(t){if(!t._cache.$bar){const e=t.getMatchingVisibleMetas("bar");let i=[];for(let n=0,o=e.length;nt-e)))}return t._cache.$bar}(t);let i,n,o,s,a=t._length;const r=()=>{32767!==o&&-32768!==o&&(ht(s)&&(a=Math.min(a,Math.abs(o-s)||a)),s=o)};for(i=0,n=e.length;iMath.abs(r)&&(l=r,c=a),e[i.axis]=c,e._custom={barStart:l,barEnd:c,start:o,end:s,min:a,max:r}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function co(t,e,i,n){const o=t.iScale,s=t.vScale,a=o.getLabels(),r=o===s,l=[];let c,h,d,u;for(c=i,h=i+n;c0?(p+=t,h-=t):h<0&&(p-=t,h+=t)}return{size:h,base:p,head:c,center:c+h/2}}_calculateBarIndexPixels(t,e){const i=this,n=e.scale,o=i.options,s=o.skipNull,a=K(o.maxBarThickness,1/0);let r,l;if(e.grouped){const n=s?i._getStackCount(t):e.stackCount,c="flex"===o.barThickness?function(t,e,i,n){const o=e.pixels,s=o[t];let a=t>0?o[t-1]:null,r=t=0;--n)i=Math.max(i,t[n].size()/2,e[n]._custom);return i>0&&i}getLabelAndValue(t){const e=this._cachedMeta,{xScale:i,yScale:n}=e,o=this.getParsed(t),s=i.getLabelForValue(o.x),a=n.getLabelForValue(o.y),r=o._custom;return{label:e.label,value:"("+s+", "+a+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){const o=this,s="reset"===n,{iScale:a,vScale:r}=o._cachedMeta,l=o.resolveDataElementOptions(e,n),c=o.getSharedOptions(l),h=o.includeOptions(n,c),d=a.axis,u=r.axis;for(let l=e;l""}}}};class go extends Ei{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,n=this._cachedMeta;let o,s;for(o=t,s=t+e;oNt(t,r,l,!0)?1:Math.max(e,e*i,n,n*i),g=(t,e,n)=>Nt(t,r,l,!0)?-1:Math.min(e,e*i,n,n*i),p=f(0,c,d),m=f(Mt,h,u),x=g(bt,c,d),b=g(bt+Mt,h,u);n=(p-x)/2,o=(m-b)/2,s=-(p+x)/2,a=-(m+b)/2}return{ratioX:n,ratioY:o,offsetX:s,offsetY:a}}(d,h,l),m=(n.width-a)/u,x=(n.height-a)/f,b=Math.max(Math.min(m,x)/2,0),_=Z(e.options.radius,b),y=(_-Math.max(_*l,0))/e._getVisibleDatasetWeightTotal();e.offsetX=g*_,e.offsetY=p*_,o.total=e.calculateTotal(),e.outerRadius=_-y*e._getRingWeightOffset(e.index),e.innerRadius=Math.max(e.outerRadius-y*c,0),e.updateElements(s,0,s.length,t)}_circumference(t,e){const i=this,n=i.options,o=i._cachedMeta,s=i._getCircumference();return e&&n.animation.animateRotate||!this.chart.getDataVisibility(t)||null===o._parsed[t]?0:i.calculateCircumference(o._parsed[t]*s/_t)}updateElements(t,e,i,n){const o=this,s="reset"===n,a=o.chart,r=a.chartArea,l=a.options.animation,c=(r.left+r.right)/2,h=(r.top+r.bottom)/2,d=s&&l.animateScale,u=d?0:o.innerRadius,f=d?0:o.outerRadius,g=o.resolveDataElementOptions(e,n),p=o.getSharedOptions(g),m=o.includeOptions(n,p);let x,b=o._getRotation();for(x=0;x0&&!isNaN(t)?_t*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Fi(e._parsed[t],i.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){const e=this;let i=0;const n=e.chart;let o,s,a,r,l;if(!t)for(o=0,s=n.data.datasets.length;o"spacing"!==t,_indexable:t=>"spacing"!==t},go.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label(t){let e=t.label;const i=": "+t.formattedValue;return Y(e)?(e=e.slice(),e[0]+=i):e+=i,e}}}}};class po extends Ei{initialize(){this.enableOptionSharing=!0,super.initialize()}update(t){const e=this,i=e._cachedMeta,{dataset:n,data:o=[],_dataset:s}=i,a=e.chart._animationsDisabled;let{start:r,count:l}=function(t,e,i){const n=e.length;let o=0,s=n;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:c,max:h,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(o=Ht(Math.min(se(r,a.axis,c).lo,i?n:se(e,l,a.getPixelForValue(c)).lo),0,n-1)),s=u?Ht(Math.max(se(r,a.axis,h).hi+1,i?0:se(e,l,a.getPixelForValue(h)).hi+1),o,n)-o:n-o}return{start:o,count:s}}(i,o,a);e._drawStart=r,e._drawCount=l,function(t){const{xScale:e,yScale:i,_scaleRanges:n}=t,o={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!n)return t._scaleRanges=o,!0;const s=n.xmin!==e.min||n.xmax!==e.max||n.ymin!==i.min||n.ymax!==i.max;return Object.assign(n,o),s}(i)&&(r=0,l=o.length),n._decimated=!!s._decimated,n.points=o;const c=e.resolveDatasetElementOptions(t);e.options.showLine||(c.borderWidth=0),c.segment=e.options.segment,e.updateElement(n,void 0,{animated:!a,options:c},t),e.updateElements(o,r,l,t)}updateElements(t,e,i,n){const o=this,s="reset"===n,{iScale:a,vScale:r,_stacked:l}=o._cachedMeta,c=o.resolveDataElementOptions(e,n),h=o.getSharedOptions(c),d=o.includeOptions(n,h),u=a.axis,f=r.axis,g=o.options.spanGaps,p=Tt(g)?g:Number.POSITIVE_INFINITY,m=o.chart._animationsDisabled||s||"none"===n;let x=e>0&&o.getParsed(e-1);for(let c=e;c0&&i[u]-x[u]>p,g.parsed=i,d&&(g.options=h||o.resolveDataElementOptions(c,e.active?"active":n)),m||o.updateElement(e,c,g,n),x=i}o.updateSharedOptions(h,n,c)}getMaxOverflow(){const t=this,e=t._cachedMeta,i=e.dataset,n=i.options&&i.options.borderWidth||0,o=e.data||[];if(!o.length)return n;const s=o[0].size(t.resolveDataElementOptions(0)),a=o[o.length-1].size(t.resolveDataElementOptions(o.length-1));return Math.max(n,s,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}po.id="line",po.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1},po.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};class mo extends Ei{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Fi(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:o}}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}_updateRadius(){const t=this,e=t.chart,i=e.chartArea,n=e.options,o=Math.min(i.right-i.left,i.bottom-i.top),s=Math.max(o/2,0),a=(s-Math.max(n.cutoutPercentage?s/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();t.outerRadius=s-a*t.index,t.innerRadius=t.outerRadius-a}updateElements(t,e,i,n){const o=this,s="reset"===n,a=o.chart,r=o.getDataset(),l=a.options.animation,c=o._cachedMeta.rScale,h=c.xCenter,d=c.yCenter,u=c.getIndexAngle(0)-.5*bt;let f,g=u;const p=360/o.countVisibleElements();for(f=0;f{!isNaN(t.data[n])&&this.chart.getDataVisibility(n)&&i++})),i}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?Et(this.resolveDataElementOptions(t,e).angle||i):0}}mo.id="polarArea",mo.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0},mo.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label:t=>t.chart.data.labels[t.dataIndex]+": "+t.formattedValue}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};class xo extends go{}xo.id="pie",xo.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};class bo extends Ei{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}update(t){const e=this,i=e._cachedMeta,n=i.dataset,o=i.data||[],s=i.iScale.getLabels();if(n.points=o,"resize"!==t){const i=e.resolveDatasetElementOptions(t);e.options.showLine||(i.borderWidth=0);const a={_loop:!0,_fullLoop:s.length===o.length,options:i};e.updateElement(n,void 0,a,t)}e.updateElements(o,0,o.length,t)}updateElements(t,e,i,n){const o=this,s=o.getDataset(),a=o._cachedMeta.rScale,r="reset"===n;for(let l=e;l"",label:t=>"("+t.label+", "+t.formattedValue+")"}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var yo=Object.freeze({__proto__:null,BarController:uo,BubbleController:fo,DoughnutController:go,LineController:po,PolarAreaController:mo,PieController:xo,RadarController:bo,ScatterController:_o});function vo(t,e,i){const{startAngle:n,pixelMargin:o,x:s,y:a,outerRadius:r,innerRadius:l}=e;let c=o/r;t.beginPath(),t.arc(s,a,r,n-c,i+c),l>o?(c=o/l,t.arc(s,a,l,i+c,n-c,!0)):t.arc(s,a,o,i+Mt,n-Mt),t.closePath(),t.clip()}function wo(t,e,i,n){const o=Ee(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const s=(i-e)/2,a=Math.min(s,n*e/2),r=t=>{const e=(i-Math.min(s,t))*n/2;return Ht(t,0,Math.min(s,e))};return{outerStart:r(o.outerStart),outerEnd:r(o.outerEnd),innerStart:Ht(o.innerStart,0,a),innerEnd:Ht(o.innerEnd,0,a)}}function Mo(t,e,i,n){return{x:i+t*Math.cos(e),y:n+t*Math.sin(e)}}function ko(t,e,i,n,o){const{x:s,y:a,startAngle:r,pixelMargin:l,innerRadius:c}=e,h=Math.max(e.outerRadius+n+i-l,0),d=c>0?c+n+i+l:0;let u=0;const f=o-r;if(n){const t=((c>0?c-n:0)+(h>0?h-n:0))/2;u=(f-(0!==t?f*t/(t+n):f))/2}const g=(f-Math.max(.001,f*h-i/bt)/h)/2,p=r+g+u,m=o-g-u,{outerStart:x,outerEnd:b,innerStart:_,innerEnd:y}=wo(e,d,h,m-p),v=h-x,w=h-b,M=p+x/v,k=m-b/w,S=d+_,P=d+y,D=p+_/S,C=m-y/P;if(t.beginPath(),t.arc(s,a,h,M,k),b>0){const e=Mo(w,k,s,a);t.arc(e.x,e.y,b,k,m+Mt)}const O=Mo(P,m,s,a);if(t.lineTo(O.x,O.y),y>0){const e=Mo(P,C,s,a);t.arc(e.x,e.y,y,m+Mt,C+Math.PI)}if(t.arc(s,a,d,m-y/d,p+_/d,!0),_>0){const e=Mo(S,D,s,a);t.arc(e.x,e.y,_,D+Math.PI,p-Mt)}const T=Mo(v,p,s,a);if(t.lineTo(T.x,T.y),x>0){const e=Mo(v,M,s,a);t.arc(e.x,e.y,x,p-Mt,M)}t.closePath()}function So(t,e,i,n,o){const{options:s}=e,a="inner"===s.borderAlign;s.borderWidth&&(a?(t.lineWidth=2*s.borderWidth,t.lineJoin="round"):(t.lineWidth=s.borderWidth,t.lineJoin="bevel"),e.fullCircles&&function(t,e,i){const{x:n,y:o,startAngle:s,pixelMargin:a,fullCircles:r}=e,l=Math.max(e.outerRadius-a,0),c=e.innerRadius+a;let h;for(i&&vo(t,e,s+_t),t.beginPath(),t.arc(n,o,c,s+_t,s,!0),h=0;h=_t||Nt(o,a,r))&&(s>=l+d&&s<=c+d)}getCenterPoint(t){const{x:e,y:i,startAngle:n,endAngle:o,innerRadius:s,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:r,spacing:l}=this.options,c=(n+o)/2,h=(s+a+l+r)/2;return{x:e+Math.cos(c)*h,y:i+Math.sin(c)*h}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const e=this,{options:i,circumference:n}=e,o=(i.offset||0)/2,s=(i.spacing||0)/2;if(e.pixelMargin="inner"===i.borderAlign?.33:0,e.fullCircles=n>_t?Math.floor(n/_t):0,0===n||e.innerRadius<0||e.outerRadius<0)return;t.save();let a=0;if(o){a=o/2;const i=(e.startAngle+e.endAngle)/2;t.translate(Math.cos(i)*a,Math.sin(i)*a),e.circumference>=bt&&(a=o)}t.fillStyle=i.backgroundColor,t.strokeStyle=i.borderColor;const r=function(t,e,i,n){const{fullCircles:o,startAngle:s,circumference:a}=e;let r=e.endAngle;if(o){ko(t,e,i,n,s+_t);for(let e=0;er&&s>r;return{count:n,start:l,loop:e.loop,ilen:c(a+(c?r-t:t))%s,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=o[b(0)],t.moveTo(d.x,d.y)),h=0;h<=r;++h){if(d=o[b(h)],d.skip)continue;const e=d.x,i=d.y,n=0|e;n===u?(ig&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=n,x=0,f=g=i),p=i}_()}function Lo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?Ao:To}Po.id="arc",Po.defaults={borderAlign:"center",borderColor:"#fff",borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0},Po.defaultRoutes={backgroundColor:"backgroundColor"};const Ro="function"==typeof Path2D;function Eo(t,e,i,n){Ro&&1===e.segments.length?function(t,e,i,n){let o=e._path;o||(o=e._path=new Path2D,e.path(o,i,n)&&o.closePath()),Do(t,e.options),t.stroke(o)}(t,e,i,n):function(t,e,i,n){const{segments:o,options:s}=e,a=Lo(e);for(const r of o)Do(t,s,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+n-1})&&t.closePath(),t.stroke()}(t,e,i,n)}class zo extends zi{constructor(t){super(),this.animated=!0,this.options=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this,n=i.options;if((n.tension||"monotone"===n.cubicInterpolationMode)&&!n.stepped&&!i._pointsUpdated){const o=n.spanGaps?i._loop:i._fullLoop;pn(i._points,n,t,o,e),i._pointsUpdated=!0}}set points(t){const e=this;e._points=t,delete e._segments,delete e._path,e._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Pn(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this,n=i.options,o=t[e],s=i.points,a=Sn(i,{property:e,start:o,end:o});if(!a.length)return;const r=[],l=function(t){return t.stepped?xn:t.tension||"monotone"===t.cubicInterpolationMode?bn:mn}(n);let c,h;for(c=0,h=a.length;c"borderDash"!==t&&"fill"!==t};class Fo extends zi{constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.options,{x:o,y:s}=this.getProps(["x","y"],i);return Math.pow(t-o,2)+Math.pow(e-s,2)t.x):Wo(e,"bottom","top",t.base=a.left&&e<=a.right)&&(s||i>=a.top&&i<=a.bottom)}function Yo(t,e){t.rect(e.x,e.y,e.w,e.h)}Fo.id="point",Fo.defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0},Fo.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};class Uo extends zi{constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,t&&Object.assign(this,t)}draw(t){const e=this.options,{inner:i,outer:n}=jo(this),o=(s=n.radius).topLeft||s.topRight||s.bottomLeft||s.bottomRight?ne:Yo;var s;t.save(),n.w===i.w&&n.h===i.h||(t.beginPath(),o(t,n),t.clip(),o(t,i),t.fillStyle=e.borderColor,t.fill("evenodd")),t.beginPath(),o(t,i),t.fillStyle=e.backgroundColor,t.fill(),t.restore()}inRange(t,e,i){return $o(this,t,e,i)}inXRange(t,e){return $o(this,t,null,e)}inYRange(t,e){return $o(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:n,horizontal:o}=this.getProps(["x","y","base","horizontal"],t);return{x:o?(e+n)/2:e,y:o?i:(i+n)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}}Uo.id="bar",Uo.defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,enableBorderRadius:!0,pointStyle:void 0},Uo.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};var Xo=Object.freeze({__proto__:null,ArcElement:Po,LineElement:zo,PointElement:Fo,BarElement:Uo});function qo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{value:e})}}function Ko(t){t.data.datasets.forEach((t=>{qo(t)}))}var Go={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Ko(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:s,indexAxis:a}=e,r=t.getDatasetMeta(o),l=s||e.data;if("y"===Ve([a,t.options.indexAxis]))return;if("line"!==r.type)return;const c=t.scales[r.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let h,{start:d,count:u}=function(t,e){const i=e.length;let n,o=0;const{iScale:s}=t,{min:a,max:r,minDefined:l,maxDefined:c}=s.getUserBounds();return l&&(o=Ht(se(e,s.axis,a).lo,0,i-1)),n=c?Ht(se(e,s.axis,r).hi+1,o,i)-o:i-o,{start:o,count:n}}(r,l);if(u<=4*n)qo(e);else{switch($(s)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":h=function(t,e,i,n,o){const s=o.samples||n;if(s>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(s-2);let l=0;const c=e+i-1;let h,d,u,f,g,p=e;for(a[l++]=t[p],h=0;hu&&(u=f,d=t[n],g=n);a[l++]=d,p=g}return a[l++]=t[c],a}(l,d,u,n,i);break;case"min-max":h=function(t,e,i,n){let o,s,a,r,l,c,h,d,u,f,g=0,p=0;const m=[],x=e+i-1,b=t[e].x,_=t[x].x-b;for(o=e;of&&(f=r,h=o),g=(p*g+s.x)/++p;else{const i=o-1;if(!$(c)&&!$(h)){const e=Math.min(c,h),n=Math.max(c,h);e!==d&&e!==i&&m.push({...t[e],x:g}),n!==d&&n!==i&&m.push({...t[n],x:g})}o>0&&i!==d&&m.push(t[i]),m.push(s),l=e,p=0,u=f=r,c=h=d=o}}return m}(l,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=h}}))},destroy(t){Ko(t)}};function Zo(t,e,i){const n=function(t){const e=t.options,i=e.fill;let n=K(i&&i.target,i);return void 0===n&&(n=!!e.backgroundColor),!1!==n&&null!==n&&(!0===n?"origin":n)}(t);if(U(n))return!isNaN(n.value)&&n;let o=parseFloat(n);return X(o)&&Math.floor(o)===o?("-"!==n[0]&&"+"!==n[0]||(o=e+o),!(o===e||o<0||o>=i)&&o):["origin","start","end","stack"].indexOf(n)>=0&&n}class Qo{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:n,y:o,radius:s}=this;return e=e||{start:0,end:_t},t.arc(n,o,s,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:n}=this,o=t.angle;return{x:e+Math.cos(o)*n,y:i+Math.sin(o)*n,angle:o}}}function Jo(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,n=e.options,o=e.getLabels().length,s=[],a=n.reverse?e.max:e.min,r=n.reverse?e.min:e.max;let l,c,h;if(h="start"===i?a:"end"===i?r:U(i)?i.value:e.getBaseValue(),n.grid.circular)return c=e.getPointPositionForValue(0,a),new Qo({x:c.x,y:c.y,radius:e.getDistanceFromCenterForValue(h)});for(l=0;lt;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function es(t){const{chart:e,scale:i,index:n,line:o}=t,s=[],a=o.segments,r=o.points,l=function(t,e){const i=[],n=t.getSortedVisibleDatasetMetas();for(let t=0;t"line"===t.type&&!t.hidden;function ns(t,e,i){const n=[];for(let o=0;o=n&&o<=c){r=o===n,l=o===c;break}}return{first:r,last:l,point:n}}function ss(t,e){let i=[],n=!1;return Y(t)?(n=!0,i=t):i=function(t,e){const{x:i=null,y:n=null}=t||{},o=e.points,s=[];return e.segments.forEach((({start:t,end:e})=>{e=ts(t,e,o);const a=o[t],r=o[e];null!==n?(s.push({x:a.x,y:n}),s.push({x:r.x,y:n})):null!==i&&(s.push({x:i,y:a.y}),s.push({x:i,y:r.y}))})),s}(t,e),i.length?new zo({points:i,options:{tension:0},_loop:n,_fullLoop:n}):null}function as(t,e,i){let n=t[e].fill;const o=[e];let s;if(!i)return n;for(;!1!==n&&-1===o.indexOf(n);){if(!X(n))return n;if(s=t[n],!s)return!1;if(s.visible)return n;o.push(n),n=s.fill}return!1}function rs(t,e,i){t.beginPath(),e.path(t),t.lineTo(e.last().x,i),t.lineTo(e.first().x,i),t.closePath(),t.clip()}function ls(t,e,i,n){if(n)return;let o=e[t],s=i[t];return"angle"===t&&(o=Wt(o),s=Wt(s)),{property:t,start:o,end:s}}function cs(t,e,i,n){return t&&e?n(t[i],e[i]):t?t[i]:e?e[i]:0}function hs(t,e,i){const{top:n,bottom:o}=e.chart.chartArea,{property:s,start:a,end:r}=i||{};"x"===s&&(t.beginPath(),t.rect(a,n,r-a,o-n),t.clip())}function ds(t,e,i,n){const o=e.interpolate(i,n);o&&t.lineTo(o.x,o.y)}function us(t,e){const{line:i,target:n,property:o,color:s,scale:a}=e,r=function(t,e,i){const n=t.segments,o=t.points,s=e.points,a=[];for(const t of n){let{start:n,end:r}=t;r=ts(n,r,o);const l=ls(i,o[n],o[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:o[n],end:o[r]});continue}const c=Sn(e,l);for(const e of c){const n=ls(i,s[e.start],s[e.end],e.loop),r=kn(t,o,n);for(const t of r)a.push({source:t,target:e,start:{[i]:cs(l,n,"start",Math.max)},end:{[i]:cs(l,n,"end",Math.min)}})}}return a}(i,n,o);for(const{source:e,target:l,start:c,end:h}of r){const{style:{backgroundColor:r=s}={}}=e;t.save(),t.fillStyle=r,hs(t,a,ls(o,c,h)),t.beginPath();const d=!!i.pathSegment(t,e);d?t.closePath():ds(t,n,h,o);const u=!!n.pathSegment(t,l,{move:d,reverse:!0}),f=d&&u;f||ds(t,n,c,o),t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function fs(t,e,i){const n=function(t){const{chart:e,fill:i,line:n}=t;if(X(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return es(t);const o=Jo(t);return o instanceof Qo?o:ss(o,n)}(e),{line:o,scale:s,axis:a}=e,r=o.options,l=r.fill,c=r.backgroundColor,{above:h=c,below:d=c}=l||{};n&&o.points.length&&(Zt(t,i),function(t,e){const{line:i,target:n,above:o,below:s,area:a,scale:r}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&s!==o&&(rs(t,n,a.top),us(t,{line:i,target:n,color:o,scale:r,property:l}),t.restore(),t.save(),rs(t,n,a.bottom)),us(t,{line:i,target:n,color:s,scale:r,property:l}),t.restore()}(t,{line:o,target:n,above:h,below:d,area:i,scale:s,axis:a}),Qt(t))}var gs={id:"filler",afterDatasetsUpdate(t,e,i){const n=(t.data.datasets||[]).length,o=[];let s,a,r,l;for(a=0;a=0;--e){const i=o[e].$filler;i&&(i.line.updateControlPoints(s,i.axis),n&&fs(t.ctx,i,s))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const n=t.getSortedVisibleDatasetMetas();for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&fs(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const n=e.meta.$filler;n&&!1!==n.fill&&"beforeDatasetDraw"===i.drawTime&&fs(t.ctx,n,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const ps=(t,e)=>{let{boxHeight:i=e,boxWidth:n=e}=t;return t.usePointStyle&&(i=Math.min(i,e),n=Math.min(n,e)),{boxWidth:n,boxHeight:i,itemHeight:Math.max(e,i)}};class ms extends zi{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){const n=this;n.maxWidth=t,n.maxHeight=e,n._margins=i,n.setDimensions(),n.buildLabels(),n.fit()}setDimensions(){const t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=t._margins.left,t.right=t.width):(t.height=t.maxHeight,t.top=t._margins.top,t.bottom=t.height)}buildLabels(){const t=this,e=t.options.labels||{};let i=Q(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter((i=>e.filter(i,t.chart.data)))),e.sort&&(i=i.sort(((i,n)=>e.sort(i,n,t.chart.data)))),t.options.reverse&&i.reverse(),t.legendItems=i}fit(){const t=this,{options:e,ctx:i}=t;if(!e.display)return void(t.width=t.height=0);const n=e.labels,o=Be(n.font),s=o.size,a=t._computeTitleHeight(),{boxWidth:r,itemHeight:l}=ps(n,s);let c,h;i.font=o.string,t.isHorizontal()?(c=t.maxWidth,h=t._fitRows(a,s,r,l)+10):(h=t.maxHeight,c=t._fitCols(a,s,r,l)+10),t.width=Math.min(c,e.maxWidth||t.maxWidth),t.height=Math.min(h,e.maxHeight||t.maxHeight)}_fitRows(t,e,i,n){const o=this,{ctx:s,maxWidth:a,options:{labels:{padding:r}}}=o,l=o.legendHitBoxes=[],c=o.lineWidths=[0],h=n+r;let d=t;s.textAlign="left",s.textBaseline="middle";let u=-1,f=-h;return o.legendItems.forEach(((t,o)=>{const g=i+e/2+s.measureText(t.text).width;(0===o||c[c.length-1]+g+2*r>a)&&(d+=h,c[c.length-(o>0?0:1)]=0,f+=h,u++),l[o]={left:0,top:f,row:u,width:g,height:n},c[c.length-1]+=g+r})),d}_fitCols(t,e,i,n){const o=this,{ctx:s,maxHeight:a,options:{labels:{padding:r}}}=o,l=o.legendHitBoxes=[],c=o.columnSizes=[],h=a-t;let d=r,u=0,f=0,g=0,p=0;return o.legendItems.forEach(((t,o)=>{const a=i+e/2+s.measureText(t.text).width;o>0&&f+n+2*r>h&&(d+=u+r,c.push({width:u,height:f}),g+=u+r,p++,u=f=0),l[o]={left:g,top:f,col:p,width:a,height:n},u=Math.max(u,a),f+=n+r})),d+=u,c.push({width:u,height:f}),d}adjustHitBoxes(){const t=this;if(!t.options.display)return;const e=t._computeTitleHeight(),{legendHitBoxes:i,options:{align:n,labels:{padding:s},rtl:a}}=t;if(this.isHorizontal()){let r=0,l=o(n,t.left+s,t.right-t.lineWidths[r]);for(const a of i)r!==a.row&&(r=a.row,l=o(n,t.left+s,t.right-t.lineWidths[r])),a.top+=t.top+e+s,a.left=l,l+=a.width+s;if(a){const e=i.reduce(((t,e)=>(t[e.row]=t[e.row]||[],t[e.row].push(e),t)),{}),n=[];Object.keys(e).forEach((t=>{e[t].reverse(),n.push(...e[t])})),t.legendHitBoxes=n}}else{let a=0,r=o(n,t.top+e+s,t.bottom-t.columnSizes[a].height);for(const l of i)l.col!==a&&(a=l.col,r=o(n,t.top+e+s,t.bottom-t.columnSizes[a].height)),l.top=r,l.left+=t.left+s,r+=l.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){const t=this;if(t.options.display){const e=t.ctx;Zt(e,t),t._draw(),Qt(e)}}_draw(){const t=this,{options:e,columnSizes:i,lineWidths:n,ctx:a}=t,{align:r,labels:l}=e,c=xt.color,h=_n(e.rtl,t.left,t.width),d=Be(l.font),{color:u,padding:f}=l,g=d.size,p=g/2;let m;t.drawTitle(),a.textAlign=h.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=d.string;const{boxWidth:x,boxHeight:b,itemHeight:_}=ps(l,g),y=t.isHorizontal(),v=this._computeTitleHeight();m=y?{x:o(r,t.left+f,t.right-n[0]),y:t.top+f+v,line:0}:{x:t.left+f,y:o(r,t.top+v+f,t.bottom-i[0].height),line:0},yn(t.ctx,e.textDirection);const w=_+f;t.legendItems.forEach(((M,k)=>{a.strokeStyle=M.fontColor||u,a.fillStyle=M.fontColor||u;const S=a.measureText(M.text).width,P=h.textAlign(M.textAlign||(M.textAlign=l.textAlign)),D=x+p+S;let C=m.x,O=m.y;h.setWidth(t.width),y?k>0&&C+D+f>t.right&&(O=m.y+=w,m.line++,C=m.x=o(r,t.left+f,t.right-n[m.line])):k>0&&O+w>t.bottom&&(C=m.x=C+i[m.line].width+f,m.line++,O=m.y=o(r,t.top+v+f,t.bottom-i[m.line].height));!function(t,e,i){if(isNaN(x)||x<=0||isNaN(b)||b<0)return;a.save();const n=K(i.lineWidth,1);if(a.fillStyle=K(i.fillStyle,c),a.lineCap=K(i.lineCap,"butt"),a.lineDashOffset=K(i.lineDashOffset,0),a.lineJoin=K(i.lineJoin,"miter"),a.lineWidth=n,a.strokeStyle=K(i.strokeStyle,c),a.setLineDash(K(i.lineDash,[])),l.usePointStyle){const o={radius:x*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},s=h.xPlus(t,x/2);Kt(a,o,s,e+p)}else{const o=e+Math.max((g-b)/2,0),s=h.leftForLtr(t,x),r=Ie(i.borderRadius);a.beginPath(),Object.values(r).some((t=>0!==t))?ne(a,{x:s,y:o,w:x,h:b,radius:r}):a.rect(s,o,x,b),a.fill(),0!==n&&a.stroke()}a.restore()}(h.x(C),O,M),C=s(P,C+x+p,y?C+D:t.right,e.rtl),function(t,e,i){ee(a,i.text,t,e+_/2,d,{strikethrough:i.hidden,textAlign:h.textAlign(i.textAlign)})}(h.x(C),O,M),y?m.x+=D+f:m.y+=w})),vn(t.ctx,e.textDirection)}drawTitle(){const t=this,e=t.options,i=e.title,s=Be(i.font),a=Fe(i.padding);if(!i.display)return;const r=_n(e.rtl,t.left,t.width),l=t.ctx,c=i.position,h=s.size/2,d=a.top+h;let u,f=t.left,g=t.width;if(this.isHorizontal())g=Math.max(...t.lineWidths),u=t.top+d,f=o(e.align,f,t.right-g);else{const i=t.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);u=d+o(e.align,t.top,t.bottom-i-e.labels.padding-t._computeTitleHeight())}const p=o(c,f,f+g);l.textAlign=r.textAlign(n(c)),l.textBaseline="middle",l.strokeStyle=i.color,l.fillStyle=i.color,l.font=s.string,ee(l,i.text,p,u,s)}_computeTitleHeight(){const t=this.options.title,e=Be(t.font),i=Fe(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){const i=this;let n,o,s;if(t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom)for(s=i.legendHitBoxes,n=0;n=o.left&&t<=o.left+o.width&&e>=o.top&&e<=o.top+o.height)return i.legendItems[n];return null}handleEvent(t){const e=this,i=e.options;if(!function(t,e){if("mousemove"===t&&(e.onHover||e.onLeave))return!0;if(e.onClick&&("click"===t||"mouseup"===t))return!0;return!1}(t.type,i))return;const n=e._getLegendItemAt(t.x,t.y);if("mousemove"===t.type){const a=e._hoveredItem,r=(s=n,null!==(o=a)&&null!==s&&o.datasetIndex===s.datasetIndex&&o.index===s.index);a&&!r&&Q(i.onLeave,[t,a,e],e),e._hoveredItem=n,n&&!r&&Q(i.onHover,[t,n,e],e)}else n&&Q(i.onClick,[t,n,e],e);var o,s}}var xs={id:"legend",_element:ms,start(t,e,i){const n=t.legend=new ms({ctx:t.ctx,options:i,chart:t});Ze.configure(t,n,i),Ze.addBox(t,n)},stop(t){Ze.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const n=t.legend;Ze.configure(t,n,i),n.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const n=e.datasetIndex,o=i.chart;o.isDatasetVisible(n)?(o.hide(n),e.hidden=!0):(o.show(n),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:n,textAlign:o,color:s}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const a=t.controller.getStyle(i?0:void 0),r=Fe(a.borderWidth);return{text:e[t.index].label,fillStyle:a.backgroundColor,fontColor:s,hidden:!t.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(r.width+r.height)/4,strokeStyle:a.borderColor,pointStyle:n||a.pointStyle,rotation:a.rotation,textAlign:o||a.textAlign,borderRadius:0,datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class bs extends zi{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this,n=i.options;if(i.left=0,i.top=0,!n.display)return void(i.width=i.height=i.right=i.bottom=0);i.width=i.right=t,i.height=i.bottom=e;const o=Y(n.text)?n.text.length:1;i._padding=Fe(n.padding);const s=o*Be(n.font).lineHeight+i._padding.height;i.isHorizontal()?i.height=s:i.width=s}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:n,right:s,options:a}=this,r=a.align;let l,c,h,d=0;return this.isHorizontal()?(c=o(r,i,s),h=e+t,l=s-i):("left"===a.position?(c=i+t,h=o(r,n,e),d=-.5*bt):(c=s-t,h=o(r,e,n),d=.5*bt),l=n-e),{titleX:c,titleY:h,maxWidth:l,rotation:d}}draw(){const t=this,e=t.ctx,i=t.options;if(!i.display)return;const o=Be(i.font),s=o.lineHeight/2+t._padding.top,{titleX:a,titleY:r,maxWidth:l,rotation:c}=t._drawArgs(s);ee(e,i.text,0,0,o,{color:i.color,maxWidth:l,rotation:c,textAlign:n(i.align),textBaseline:"middle",translation:[a,r]})}}var _s={id:"title",_element:bs,start(t,e,i){!function(t,e){const i=new bs({ctx:t.ctx,options:e,chart:t});Ze.configure(t,i,e),Ze.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;Ze.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const n=t.titleBlock;Ze.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const ys=new WeakMap;var vs={id:"subtitle",start(t,e,i){const n=new bs({ctx:t.ctx,options:i,chart:t});Ze.configure(t,n,i),Ze.addBox(t,n),ys.set(t,n)},stop(t){Ze.removeBox(t,ys.get(t)),ys.delete(t)},beforeUpdate(t,e,i){const n=ys.get(t);Ze.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const ws={average(t){if(!t.length)return!1;let e,i,n=0,o=0,s=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function Ss(t,e){const{element:i,datasetIndex:n,index:o}=e,s=t.getDatasetMeta(n).controller,{label:a,value:r}=s.getLabelAndValue(o);return{chart:t,label:a,parsed:s.getParsed(o),raw:t.data.datasets[n].data[o],formattedValue:r,dataset:s.getDataset(),dataIndex:o,datasetIndex:n,element:i}}function Ps(t,e){const i=t._chart.ctx,{body:n,footer:o,title:s}=t,{boxWidth:a,boxHeight:r}=e,l=Be(e.bodyFont),c=Be(e.titleFont),h=Be(e.footerFont),d=s.length,u=o.length,f=n.length,g=Fe(e.padding);let p=g.height,m=0,x=n.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*c.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){p+=f*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-f)*l.lineHeight+(x-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*h.lineHeight+(u-1)*e.footerSpacing);let b=0;const _=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=c.string,J(t.title,_),i.font=l.string,J(t.beforeBody.concat(t.afterBody),_),b=e.displayColors?a+2:0,J(n,(t=>{J(t.before,_),J(t.lines,_),J(t.after,_)})),b=0,i.font=h.string,J(t.footer,_),i.restore(),m+=g.width,{width:m,height:p}}function Ds(t,e,i,n){const{x:o,width:s}=i,{width:a,chartArea:{left:r,right:l}}=t;let c="center";return"center"===n?c=o<=(r+l)/2?"left":"right":o<=s/2?c="left":o>=a-s/2&&(c="right"),function(t,e,i,n){const{x:o,width:s}=n,a=i.caretSize+i.caretPadding;return"left"===t&&o+s+a>e.width||"right"===t&&o-s-a<0||void 0}(c,t,e,i)&&(c="center"),c}function Cs(t,e,i){const n=e.yAlign||function(t,e){const{y:i,height:n}=e;return it.height-n/2?"bottom":"center"}(t,i);return{xAlign:e.xAlign||Ds(t,e,i,n),yAlign:n}}function Os(t,e,i,n){const{caretSize:o,caretPadding:s,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,c=o+s,h=a+s;let d=function(t,e){let{x:i,width:n}=t;return"right"===e?i-=n:"center"===e&&(i-=n/2),i}(e,r);const u=function(t,e,i){let{y:n,height:o}=t;return"top"===e?n+=i:n-="bottom"===e?o+i:o/2,n}(e,l,c);return"center"===l?"left"===r?d+=c:"right"===r&&(d-=c):"left"===r?d-=h:"right"===r&&(d+=h),{x:Ht(d,0,n.width-e.width),y:Ht(u,0,n.height-e.height)}}function Ts(t,e,i){const n=Fe(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-n.right:t.x+n.left}function As(t){return Ms([],ks(t))}function Ls(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}class Rs extends zi{constructor(t){super(),this.opacity=0,this._active=[],this._chart=t._chart,this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this,e=t._cachedAnimations;if(e)return e;const i=t._chart,n=t.options.setContext(t.getContext()),o=n.enabled&&i.options.animation&&n.animations,s=new wi(t._chart,o);return o._cacheable&&(t._cachedAnimations=Object.freeze(s)),s}getContext(){const t=this;return t.$context||(t.$context=(e=t._chart.getContext(),i=t,n=t._tooltipItems,Object.assign(Object.create(e),{tooltip:i,tooltipItems:n,type:"tooltip"})));var e,i,n}getTitle(t,e){const i=this,{callbacks:n}=e,o=n.beforeTitle.apply(i,[t]),s=n.title.apply(i,[t]),a=n.afterTitle.apply(i,[t]);let r=[];return r=Ms(r,ks(o)),r=Ms(r,ks(s)),r=Ms(r,ks(a)),r}getBeforeBody(t,e){return As(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){const i=this,{callbacks:n}=e,o=[];return J(t,(t=>{const e={before:[],lines:[],after:[]},s=Ls(n,t);Ms(e.before,ks(s.beforeLabel.call(i,t))),Ms(e.lines,s.label.call(i,t)),Ms(e.after,ks(s.afterLabel.call(i,t))),o.push(e)})),o}getAfterBody(t,e){return As(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){const i=this,{callbacks:n}=e,o=n.beforeFooter.apply(i,[t]),s=n.footer.apply(i,[t]),a=n.afterFooter.apply(i,[t]);let r=[];return r=Ms(r,ks(o)),r=Ms(r,ks(s)),r=Ms(r,ks(a)),r}_createItems(t){const e=this,i=e._active,n=e._chart.data,o=[],s=[],a=[];let r,l,c=[];for(r=0,l=i.length;rt.filter(e,i,o,n)))),t.itemSort&&(c=c.sort(((e,i)=>t.itemSort(e,i,n)))),J(c,(i=>{const n=Ls(t.callbacks,i);o.push(n.labelColor.call(e,i)),s.push(n.labelPointStyle.call(e,i)),a.push(n.labelTextColor.call(e,i))})),e.labelColors=o,e.labelPointStyles=s,e.labelTextColors=a,e.dataPoints=c,c}update(t,e){const i=this,n=i.options.setContext(i.getContext()),o=i._active;let s,a=[];if(o.length){const t=ws[n.position].call(i,o,i._eventPosition);a=i._createItems(n),i.title=i.getTitle(a,n),i.beforeBody=i.getBeforeBody(a,n),i.body=i.getBody(a,n),i.afterBody=i.getAfterBody(a,n),i.footer=i.getFooter(a,n);const e=i._size=Ps(i,n),r=Object.assign({},t,e),l=Cs(i._chart,n,r),c=Os(n,r,l,i._chart);i.xAlign=l.xAlign,i.yAlign=l.yAlign,s={opacity:1,x:c.x,y:c.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==i.opacity&&(s={opacity:0});i._tooltipItems=a,i.$context=void 0,s&&i._resolveAnimations().update(i,s),t&&n.external&&n.external.call(i,{chart:i._chart,tooltip:i,replay:e})}drawCaret(t,e,i,n){const o=this.getCaretPosition(t,i,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,i){const{xAlign:n,yAlign:o}=this,{cornerRadius:s,caretSize:a}=i,{x:r,y:l}=t,{width:c,height:h}=e;let d,u,f,g,p,m;return"center"===o?(p=l+h/2,"left"===n?(d=r,u=d-a,g=p+a,m=p-a):(d=r+c,u=d+a,g=p-a,m=p+a),f=d):(u="left"===n?r+s+a:"right"===n?r+c-s-a:this.caretX,"top"===o?(g=l,p=g-a,d=u-a,f=u+a):(g=l+h,p=g+a,d=u+a,f=u-a),m=g),{x1:d,x2:u,x3:f,y1:g,y2:p,y3:m}}drawTitle(t,e,i){const n=this,o=n.title,s=o.length;let a,r,l;if(s){const c=_n(i.rtl,n.x,n.width);for(t.x=Ts(n,i.titleAlign,i),e.textAlign=c.textAlign(i.titleAlign),e.textBaseline="middle",a=Be(i.titleFont),r=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,l=0;l0!==t))?(t.beginPath(),t.fillStyle=o.multiKeyBackground,ne(t,{x:e,y:g,w:c,h:l,radius:s}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),ne(t,{x:i,y:g+1,w:c-2,h:l-2,radius:s}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(e,g,c,l),t.strokeRect(e,g,c,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,c-2,l-2))}t.fillStyle=s.labelTextColors[i]}drawBody(t,e,i){const n=this,{body:o}=n,{bodySpacing:s,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:c}=i,h=Be(i.bodyFont);let d=h.lineHeight,u=0;const f=_n(i.rtl,n.x,n.width),g=function(i){e.fillText(i,f.x(t.x+u),t.y+d/2),t.y+=d+s},p=f.textAlign(a);let m,x,b,_,y,v,w;for(e.textAlign=a,e.textBaseline="middle",e.font=h.string,t.x=Ts(n,p,i),e.fillStyle=i.bodyColor,J(n.beforeBody,g),u=r&&"right"!==p?"center"===a?c/2+1:c+2:0,_=0,v=o.length;_0&&e.stroke()}_updateAnimationTarget(t){const e=this,i=e._chart,n=e.$animations,o=n&&n.x,s=n&&n.y;if(o||s){const n=ws[t.position].call(e,e._active,e._eventPosition);if(!n)return;const a=e._size=Ps(e,t),r=Object.assign({},n,e._size),l=Cs(i,t,r),c=Os(t,r,l,i);o._to===c.x&&s._to===c.y||(e.xAlign=l.xAlign,e.yAlign=l.yAlign,e.width=a.width,e.height=a.height,e.caretX=n.x,e.caretY=n.y,e._resolveAnimations().update(e,c))}}draw(t){const e=this,i=e.options.setContext(e.getContext());let n=e.opacity;if(!n)return;e._updateAnimationTarget(i);const o={width:e.width,height:e.height},s={x:e.x,y:e.y};n=Math.abs(n)<.001?0:n;const a=Fe(i.padding),r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;i.enabled&&r&&(t.save(),t.globalAlpha=n,e.drawBackground(s,t,o,i),yn(t,i.textDirection),s.y+=a.top,e.drawTitle(s,t,i),e.drawBody(s,t,i),e.drawFooter(s,t,i),vn(t,i.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this,n=i._active,o=t.map((({datasetIndex:t,index:e})=>{const n=i._chart.getDatasetMeta(t);if(!n)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:n.data[e],index:e}})),s=!tt(n,o),a=i._positionChanged(o,e);(s||a)&&(i._active=o,i._eventPosition=e,i.update(!0))}handleEvent(t,e){const i=this,n=i.options,o=i._active||[];let s=!1,a=[];"mouseout"!==t.type&&(a=i._chart.getElementsAtEventForMode(t,n.mode,n,e),n.reverse&&a.reverse());const r=i._positionChanged(a,t);return s=e||!tt(a,o)||r,s&&(i._active=a,(n.enabled||n.external)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0,e))),s}_positionChanged(t,e){const{caretX:i,caretY:n,options:o}=this,s=ws[o.position].call(this,t,e);return!1!==s&&(i!==s.x||n!==s.y)}}Rs.positioners=ws;var Es={id:"tooltip",_element:Rs,positioners:ws,afterInit(t,e,i){i&&(t.tooltip=new Rs({_chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip,i={tooltip:e};!1!==t.notifyPlugins("beforeTooltipDraw",i)&&(e&&e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i))},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:H,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,n=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(n>0&&e.dataIndex"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},zs=Object.freeze({__proto__:null,Decimation:Go,Filler:gs,Legend:xs,SubTitle:vs,Title:_s,Tooltip:Es});function Is(t,e,i){const n=t.indexOf(e);if(-1===n)return((t,e,i)=>"string"==typeof e?t.push(e)-1:isNaN(e)?null:i)(t,e,i);return n!==t.lastIndexOf(e)?i:n}class Fs extends qi{constructor(t){super(t),this._startValue=void 0,this._valueRange=0}parse(t,e){if($(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:Ht(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:Is(i,t,K(e,t)),i.length-1)}determineDataLimits(){const t=this,{minDefined:e,maxDefined:i}=t.getUserBounds();let{min:n,max:o}=t.getMinMax(!0);"ticks"===t.options.bounds&&(e||(n=0),i||(o=t.getLabels().length-1)),t.min=n,t.max=o}buildTicks(){const t=this,e=t.min,i=t.max,n=t.options.offset,o=[];let s=t.getLabels();s=0===e&&i===s.length-1?s:s.slice(e,i+1),t._valueRange=Math.max(s.length-(n?0:1),1),t._startValue=t.min-(n?.5:0);for(let t=e;t<=i;t++)o.push({value:t});return o}getLabelForValue(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){const e=this;return Math.round(e._startValue+e.getDecimalForPixel(t)*e._valueRange)}getBasePixel(){return this.bottom}}function Bs(t,e,{horizontal:i,minRotation:n}){const o=Et(n),s=(i?Math.sin(o):Math.cos(o))||.001,a=.75*e*(""+t).length;return Math.min(e/s,a)}Fs.id="category",Fs.defaults={ticks:{callback:Fs.prototype.getLabelForValue}};class Vs extends qi{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return $(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const t=this,{beginAtZero:e}=t.options,{minDefined:i,maxDefined:n}=t.getUserBounds();let{min:o,max:s}=t;const a=t=>o=i?o:t,r=t=>s=n?s:t;if(e){const t=Dt(o),e=Dt(s);t<0&&e<0?r(0):t>0&&e>0&&a(0)}o===s&&(r(s+1),e||a(o-1)),t.min=o,t.max=s}getTickLimit(){const t=this,e=t.options.ticks;let i,{maxTicksLimit:n,stepSize:o}=e;return o?i=Math.ceil(t.max/o)-Math.floor(t.min/o)+1:(i=t.computeTickLimit(),n=n||11),n&&(i=Math.min(n,i)),i}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this,e=t.options,i=e.ticks;let n=t.getTickLimit();n=Math.max(2,n);const o=function(t,e){const i=[],{bounds:n,step:o,min:s,max:a,precision:r,count:l,maxTicks:c,maxDigits:h,includeBounds:d}=t,u=o||1,f=c-1,{min:g,max:p}=e,m=!$(s),x=!$(a),b=!$(l),_=(p-g)/(h+1);let y,v,w,M,k=Ct((p-g)/f/u)*u;if(k<1e-14&&!m&&!x)return[{value:g},{value:p}];M=Math.ceil(p/k)-Math.floor(g/k),M>f&&(k=Ct(M*k/f/u)*u),$(r)||(y=Math.pow(10,r),k=Math.ceil(k*y)/y),"ticks"===n?(v=Math.floor(g/k)*k,w=Math.ceil(p/k)*k):(v=g,w=p),m&&x&&o&&Lt((a-s)/o,k/1e3)?(M=Math.round(Math.min((a-s)/k,c)),k=(a-s)/M,v=s,w=a):b?(v=m?s:v,w=x?a:w,M=l-1,k=(w-v)/M):(M=(w-v)/k,M=At(M,Math.round(M),k/1e3)?Math.round(M):Math.ceil(M));const S=Math.max(It(k),It(v));y=Math.pow(10,$(r)?S:r),v=Math.round(v*y)/y,w=Math.round(w*y)/y;let P=0;for(m&&(d&&v!==s?(i.push({value:s}),v0?i:null;this._zero=!0}determineDataLimits(){const t=this,{min:e,max:i}=t.getMinMax(!0);t.min=X(e)?Math.max(0,e):null,t.max=X(i)?Math.max(0,i):null,t.options.beginAtZero&&(t._zero=!0),t.handleTickRangeOptions()}handleTickRangeOptions(){const t=this,{minDefined:e,maxDefined:i}=t.getUserBounds();let n=t.min,o=t.max;const s=t=>n=e?n:t,a=t=>o=i?o:t,r=(t,e)=>Math.pow(10,Math.floor(Pt(t))+e);n===o&&(n<=0?(s(1),a(10)):(s(r(n,-1)),a(r(o,1)))),n<=0&&s(r(o,-1)),o<=0&&a(r(n,1)),t._zero&&t.min!==t._suggestedMin&&n===r(t.min,0)&&s(r(n,-1)),t.min=n,t.max=o}buildTicks(){const t=this,e=t.options,i=function(t,e){const i=Math.floor(Pt(e.max)),n=Math.ceil(e.max/Math.pow(10,i)),o=[];let s=q(t.min,Math.pow(10,Math.floor(Pt(e.min)))),a=Math.floor(Pt(s)),r=Math.floor(s/Math.pow(10,a)),l=a<0?Math.pow(10,Math.abs(a)):1;do{o.push({value:s,major:Ns(s)}),++r,10===r&&(r=1,++a,l=a>=0?1:l),s=Math.round(r*Math.pow(10,a)*l)/l}while(ao?{start:e-i,end:e}:{start:e,end:e+i}}function Ys(t){const e={l:0,r:t.width,t:0,b:t.height-t.paddingTop},i={},n=[],o=[],s=t.getLabels().length;for(let c=0;ce.r&&(e.r=p.end,i.r=f),m.starte.b&&(e.b=m.end,i.b=f)}var a,r,l;t._setReductions(t.drawingArea,e,i),t._pointLabelItems=function(t,e,i){const n=[],o=t.getLabels().length,s=t.options,a=js(s),r=t.getDistanceFromCenterForValue(s.ticks.reverse?t.min:t.max);for(let s=0;s270||i<90)&&(t-=e),t}function Ks(t,e,i,n){const{ctx:o}=t;if(i)o.arc(t.xCenter,t.yCenter,e,0,_t);else{let i=t.getPointPosition(0,e);o.moveTo(i.x,i.y);for(let s=1;s{const n=Q(e.options.pointLabels.callback,[t,i],e);return n||0===n?n:""}))}fit(){const t=this,e=t.options;e.display&&e.pointLabels.display?Ys(t):t.setCenterPoint(0,0,0,0)}_setReductions(t,e,i){const n=this;let o=e.l/Math.sin(i.l),s=Math.max(e.r-n.width,0)/Math.sin(i.r),a=-e.t/Math.cos(i.t),r=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);o=Gs(o),s=Gs(s),a=Gs(a),r=Gs(r),n.drawingArea=Math.max(t/2,Math.min(Math.floor(t-(o+s)/2),Math.floor(t-(a+r)/2))),n.setCenterPoint(o,s,a,r)}setCenterPoint(t,e,i,n){const o=this,s=o.width-e-o.drawingArea,a=t+o.drawingArea,r=i+o.drawingArea,l=o.height-o.paddingTop-n-o.drawingArea;o.xCenter=Math.floor((a+s)/2+o.left),o.yCenter=Math.floor((r+l)/2+o.top+o.paddingTop)}getIndexAngle(t){return Wt(t*(_t/this.getLabels().length)+Et(this.options.startAngle||0))}getDistanceFromCenterForValue(t){const e=this;if($(t))return NaN;const i=e.drawingArea/(e.max-e.min);return e.options.reverse?(e.max-t)*i:(t-e.min)*i}getValueForDistanceFromCenter(t){if($(t))return NaN;const e=this,i=t/(e.drawingArea/(e.max-e.min));return e.options.reverse?e.max-i:e.min+i}getPointPosition(t,e){const i=this,n=i.getIndexAngle(t)-Mt;return{x:Math.cos(n)*e+i.xCenter,y:Math.sin(n)*e+i.yCenter,angle:n}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:n,bottom:o}=this._pointLabelItems[t];return{left:e,top:i,right:n,bottom:o}}drawBackground(){const t=this,{backgroundColor:e,grid:{circular:i}}=t.options;if(e){const n=t.ctx;n.save(),n.beginPath(),Ks(t,t.getDistanceFromCenterForValue(t._endValue),i,t.getLabels().length),n.closePath(),n.fillStyle=e,n.fill(),n.restore()}}drawGrid(){const t=this,e=t.ctx,i=t.options,{angleLines:n,grid:o}=i,s=t.getLabels().length;let a,r,l;if(i.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:n}}=t;for(let o=e-1;o>=0;o--){const e=n.setContext(t.getContext(o)),s=Be(e.font),{x:a,y:r,textAlign:l,left:c,top:h,right:d,bottom:u}=t._pointLabelItems[o],{backdropColor:f}=e;if(!$(f)){const t=Fe(e.backdropPadding);i.fillStyle=f,i.fillRect(c-t.left,h-t.top,d-c+t.width,u-h+t.height)}ee(i,t._pointLabels[o],a,r+s.lineHeight/2,s,{color:e.color,textAlign:l,textBaseline:"middle"})}}(t,s),o.display&&t.ticks.forEach(((e,i)=>{if(0!==i){r=t.getDistanceFromCenterForValue(e.value);const n=o.setContext(t.getContext(i-1));!function(t,e,i,n){const o=t.ctx,s=e.circular,{color:a,lineWidth:r}=e;!s&&!n||!a||!r||i<0||(o.save(),o.strokeStyle=a,o.lineWidth=r,o.setLineDash(e.borderDash),o.lineDashOffset=e.borderDashOffset,o.beginPath(),Ks(t,i,s,n),o.closePath(),o.stroke(),o.restore())}(t,n,r,s)}})),n.display){for(e.save(),a=t.getLabels().length-1;a>=0;a--){const o=n.setContext(t.getContext(a)),{color:s,lineWidth:c}=o;c&&s&&(e.lineWidth=c,e.strokeStyle=s,e.setLineDash(o.borderDash),e.lineDashOffset=o.borderDashOffset,r=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),l=t.getPointPosition(a,r),e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(l.x,l.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){const t=this,e=t.ctx,i=t.options,n=i.ticks;if(!n.display)return;const o=t.getIndexAngle(0);let s,a;e.save(),e.translate(t.xCenter,t.yCenter),e.rotate(o),e.textAlign="center",e.textBaseline="middle",t.ticks.forEach(((o,r)=>{if(0===r&&!i.reverse)return;const l=n.setContext(t.getContext(r)),c=Be(l.font);if(s=t.getDistanceFromCenterForValue(t.ticks[r].value),l.showLabelBackdrop){e.font=c.string,a=e.measureText(o.label).width,e.fillStyle=l.backdropColor;const t=Fe(l.backdropPadding);e.fillRect(-a/2-t.left,-s-c.size/2-t.top,a+t.width,c.size+t.height)}ee(e,o.label,0,-s,c,{color:l.color})})),e.restore()}drawTitle(){}}Zs.id="radialLinear",Zs.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Vi.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5}},Zs.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"},Zs.descriptors={angleLines:{_fallback:"grid"}};const Qs={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Js=Object.keys(Qs);function ta(t,e){return t-e}function ea(t,e){if($(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:s}=t._parseOpts;let a=e;return"function"==typeof n&&(a=n(a)),X(a)||(a="string"==typeof n?i.parse(a,n):i.parse(a)),null===a?null:(o&&(a="week"!==o||!Tt(s)&&!0!==s?i.startOf(a,o):i.startOf(a,"isoWeek",s)),+a)}function ia(t,e,i,n){const o=Js.length;for(let s=Js.indexOf(t);s=e?i[n]:i[o]]=!0}}else t[e]=!0}function oa(t,e,i){const n=[],o={},s=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,n,o,i):n}class sa extends qi{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e){const i=t.time||(t.time={}),n=this._adapter=new ao._date(t.adapters.date);st(i.displayFormats,n.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:ea(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this,e=t.options,i=t._adapter,n=e.time.unit||"day";let{min:o,max:s,minDefined:a,maxDefined:r}=t.getUserBounds();function l(t){a||isNaN(t.min)||(o=Math.min(o,t.min)),r||isNaN(t.max)||(s=Math.max(s,t.max))}a&&r||(l(t._getLabelBounds()),"ticks"===e.bounds&&"labels"===e.ticks.source||l(t.getMinMax(!1))),o=X(o)&&!isNaN(o)?o:+i.startOf(Date.now(),n),s=X(s)&&!isNaN(s)?s:+i.endOf(Date.now(),n)+1,t.min=Math.min(o,s-1),t.max=Math.max(o+1,s)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this,e=t.options,i=e.time,n=e.ticks,o="labels"===n.source?t.getLabelTimestamps():t._generate();"ticks"===e.bounds&&o.length&&(t.min=t._userMin||o[0],t.max=t._userMax||o[o.length-1]);const s=t.min,a=re(o,s,t.max);return t._unit=i.unit||(n.autoSkip?ia(i.minUnit,t.min,t.max,t._getLabelCapacity(s)):function(t,e,i,n,o){for(let s=Js.length-1;s>=Js.indexOf(i);s--){const i=Js[s];if(Qs[i].common&&t._adapter.diff(o,n,i)>=e-1)return i}return Js[i?Js.indexOf(i):0]}(t,a.length,i.minUnit,t.min,t.max)),t._majorUnit=n.major.enabled&&"year"!==t._unit?function(t){for(let e=Js.indexOf(t)+1,i=Js.length;e1e5*r)throw new Error(i+" and "+n+" are too far apart with stepSize of "+r+" "+a);const g="data"===o.ticks.source&&t.getDataTimestamps();for(d=f,u=0;dt-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,n){const o=this,s=o.options,a=s.time.displayFormats,r=o._unit,l=o._majorUnit,c=r&&a[r],h=l&&a[l],d=i[e],u=l&&h&&d&&d.major,f=o._adapter.format(t,n||(u?h:c)),g=s.ticks.callback;return g?Q(g,[f,e,i],o):f}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e0?r:1}getDataTimestamps(){const t=this;let e,i,n=t._cache.data||[];if(n.length)return n;const o=t.getMatchingVisibleMetas();if(t._normalized&&o.length)return t._cache.data=o[0].controller.getAllParsedValues(t);for(e=0,i=o.length;e=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=se(t,"pos",e)),({pos:n,time:s}=t[r]),({pos:o,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=se(t,"time",e)),({time:n,pos:s}=t[r]),({time:o,pos:a}=t[l]));const c=o-n;return c?s+(a-s)*(e-n)/c:s}sa.id="time",sa.defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",major:{enabled:!1}}};class ra extends sa{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this,e=t._getTimestampsForTable(),i=t._table=t.buildLookupTable(e);t._minPos=aa(i,t.min),t._tableRange=aa(i,t.max)-t._minPos,super.initOffsets(e)}buildLookupTable(t){const{min:e,max:i}=this,n=[],o=[];let s,a,r,l,c;for(s=0,a=t.length;s=e&&l<=i&&n.push(l);if(n.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(s=0,a=n.length;snot want to track." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Unikal" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Gəlişlər" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Brauzer" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Faiz" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Qonaqlar" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Əsas sözlər" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Əsas söz" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Rədd etmələr" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Təsviri" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Unikal gonaqlar" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Səhifəyə baxışlar" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Rədd cavabının miqdarı" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Bir gəlişə maksimal baxılan səhifə" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Həlli" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Tarix" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-be_BY.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-be_BY.mo new file mode 100644 index 0000000000000000000000000000000000000000..4c1a7d7c7954893a161f3e3e941fc303ee27a1cf GIT binary patch literal 1798 zcmZ{jOKclO7{`ZFUWV`}524bE0n{ocT6;GQO6z3P#-)*}Hj0%xMH~Qa*OO!$XV;w_ z*NGIQ#)a}o#Y^Q<9s$uqxrHcJorXAvUXhr+aRN@Ujs>J9HjVjAnDJ74}k9{?^i&IUj!ckuY>o3&BWeF-hWK)e*&qdU$CEr-|r~q zVX)&K#$EvTfMg#@I0BOX>)U5bQ;e>iP}b2i^vEfqPNJZqNj&-V@*x;222n zXF;0Zo8Z&nXJ8k&0@93s1*wkPU@~G@j6IHx6!8qHUz!d1p`AGHNs#77>%lhI-3jUc zpk63H)lBttU?W9bBfuV`A6kPx7g7e22d-O{qQnNPYLcs9O86`vRDD-)7f^{&VtEJ6#|{ zcAD~T9Uv-$v%*!z@se>`$Pkh_{z}1!lcx$JMdPRxs37nSYA?sTO{>?iOv5~cW9~q2 zm)UKaa5P2*we&xJJyw^Al{)E!%0Q)lSawiFjt}}JdFxxAm$$A>l~FxB{D~@tVHAZk zo#S~?c4Rg59G`b4=QQt}RH~B8W^1)tMv<5|E@m=rFrBT?%(AtL(LR(DvFsV~M*h`o zIyHQJ_}F%zR>n*n4Sa=Z8^zfQx>I6CWh-UJ^ZU3v>Bvwhd#pHQ9NhM!eB(kI$9y*^ zq2e4rc*av(b?11TD^)00rBgPB0y!P#xL=9Q(C+Eu?W5i4@3TzXw)p=2oQ~#mwq^0d z+~jbFJz#flKK0u@bc`d+eyf|$&9y@Yte!MNtR%#?O?ry`2JDx%!w;pm?xBk`n>qV! zC>-Y95IB(TOEJ9|UC=Gv)Hif1dRMRMB_1D|`a6A7FERa*UXJRzm3$8RDxBAJGkQli zqIoQgjiojpzc?S76jh`Kn%vJ|H0y(G4EWLm2|Pb;nz@ z@b@>weU3~wqxlR1qB?2obrf`o>kVoJD&NP~4P2wP8*xW^1ud>~h*PJ{sE#W21`hM> zaNS5ILE+R7N$KT(q=*(ay)L2Zb+keKwm;i=8q^sy={KHU`-wha{T0mzstrt;N^4Te zFEERC6D_@ph$hotV+aks5`7rG2cK0Qy#=gAm#HMCzlkGh*0`budWaUHw=s}- Y9F4fBI#fw{6)pVt^(ROa&nE8bFX0t;%K!iX literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-be_BY.po b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-be_BY.po new file mode 100644 index 00000000..7392dccc --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-be_BY.po @@ -0,0 +1,1530 @@ +# +# Translators: +# Andre Braekling , 2009 +# FatCow http://www.fatcow.com, 2009 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:41+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Belarusian (Belarus) (http://www.transifex.com/piwik/wp-piwik/language/be_BY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be_BY\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "" + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "" + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Настройки" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Piwik статистика" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "Произошла ошибка" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Piwik URL" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "Авто token" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "Следящий фильтр" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Уникальность" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Визитов" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Браузер" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Процентов" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Посетителей" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Ключевые слова" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Ключевое слово" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Отказов" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Описание" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Уникальных посетителей" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Просмотров страницы" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Количество отказов" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Макс. страниц просмтрено за один визит" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Разрешение" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Дата" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-cs_CZ.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa381ab7a8cc248afef94cb63fc6936520c6856f GIT binary patch literal 474 zcmZus!A`7LG1u(i>-a^4hV;keLFiP* ziov5#e3{9)<=+LQqXjouCO6y&236`dh)W4=VajTaGObdILNXMuGH?G^S9i-4Vcqi7 zkU(>lM%=`j!Ic{8^*3DW_18R-YKjUqUGk|Qf#3@Uop%w=z}|+TNS32Wh9$6P#w5&f zvMj5Ze4Lz!RV9oUPLdmUvV?4t=x>}8rq7)xr(_NKgYN!Pw?eH>tc*}->n*|ij93{b ziMUj42xnZU!g%*Vk2LqXeBVT9(p6zRM$ZhIBWZTd8Ekf0ezep)BE48IQU)s7JX5dM ihHdKE%JbY3Tml6Kwz}}DP%MHv_v(4k#bUK>6@CFfD2O`% literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-cs_CZ.po b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-cs_CZ.po new file mode 100644 index 00000000..6a9f8505 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-cs_CZ.po @@ -0,0 +1,1528 @@ +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:41+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/piwik/wp-piwik/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "" + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "" + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_CH.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_CH.mo new file mode 100644 index 0000000000000000000000000000000000000000..c52e903e56049b9ecd863ecdbbb35cd62c79ce6e GIT binary patch literal 445 zcmZus%TB{E5G;aIj+{9di9@U6#wkc`UF86MKqV?72yjFu*|w&M9XT#3T=@q6fD7Nz z|KMBLv{HLvq>;z=?C$LE;lWo0v4=cDo*?&;r^pg*&t4P+tbPH-F2o&jO;nf8SRPMXYXQIAp9LCMcrb=G7Ijr0!QWLf^N@7$|1gmWWu zOG6`6o(QWACl@LV{R^RhPswq0ubRnidLl7w^S71`1NcFyu_5(~JR9qv~nY9^r z-J&QOwrnORuxvy+b+a2s^cu|RX=OoSsP_!Fv#_*o zmI$f3B$^46gY_T6A#Lw`<-7?PI#7|0F)=6Y7iqV-Ia$wgf@EPtLWkO%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_DE.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..ccb2017c22950ab633aa426c2c79c5655051f81c GIT binary patch literal 34143 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, 2011 +# André Bräkling, 2015-2017 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:51+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: German (Germany) (http://www.transifex.com/piwik/wp-piwik/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "%s %s installiert." + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "Als nächstes solltest Du eine Verbindung zu Piwik herstellen" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "%s aktualisiert auf %s." + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "Bitte überprüfe Deine Konfiguration" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Einstellungen" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "Wichtig" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Piwik Statistiken" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "Konfiguriere WP-Piwik" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "Ein Fehler ist aufgetreten" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "Support" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "Schummelst wohl?" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "Neu laden" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "Änderungen gespeichert" + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "Vielen Dank für die Verwendung von WP-Piwik!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s wurde erfolgreich mit Piwik %s verbunden." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "Du verwendest WordPress %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "Du verwendest ein WordPress %s Blog Netzwerk (WPMU). WP-Piwik wird Deine Seiten als unterschiedliche Webseiten behandeln." + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "WP-Piwik %s konnte sich mit Deiner Konfiguration nicht mit Piwik verbinden. Bitte überprüfe die »Mit Piwik verbinden«-Sektion unten." + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "WP-Piwik %s konnte mit der vorliegenden Konfiguration keine Verbindung zu Piwik aufbauen. Beim Verbindungsaufbau ist folgender Fehler aufgetreten:
%s" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "WP-Piwik %s muss zunächst mit Piwik verbunden werden. Bitte überprüfe die »Mit Piwik verbinden«-Sektion unten." + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Mit Piwik verbinden" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "Zeige Statistiken" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "Aktiviere Tracking" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "Expertenkonfiguration" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "Danksagungen" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "WP-Piwik ist ein WordPress Plugin, um eine Auswahl von Piwik-Statistiken in Deinem WordPress Admin-Dashboard anzuzeigen, und um Deinen Piwik-Tracking-Code hinzuzufügen und zu konfigurieren. Um es zu verwenden, musst Du zunächst eine Piwik-Installation haben. Es gibt zwei Möglichkeiten: Betreibe Piwik entweder " + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "ein selbst-gehostetes Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "oder" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "ein cloud-gehostetes Piwik von InnoCraft" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "Weder cURL noch dopen sind verfügbar. Daher kann WP-Piwik sich weder mit der HTTP noch mit der InnoCraft Cloud verbinden." + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "Weitere Informationen" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "Du kannst zwischen drei Verbindungsmöglichkeiten wählen:" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "Selbst-gehostet (HTTP API, Standard)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "Dies ist die Standard-Einstellung für ein selbst-gehostetes Piwik und sollte in den meisten Konfigurationen funktionieren. WP-Piwik verbindet sich mit Piwik über http(s)." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "Selbst-gehostet (PHP API)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "Wähle diese Option, wenn Dein selbst-gehostetes Piwik und WordPress auf dem gleichen Server laufen und Du den vollen Serverpfad zu Deiner Piwik-Installation kennst." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "Cloud-hosted (InnoCraft Cloud)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "Wenn Du ein cloud-hosted Piwik von InnoCraft verwendet, kannst Du einfach diese Option wählen." + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Piwik-Modus" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "Deaktiviert (WP-Piwik wird sich nicht mit Piwik verbinden)" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Piwik URL" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "Gebe Deine Piwik-URL ein. Es handelt sich um die gleiche URL, die Du auch verwendest, um Dein Piwik zu öffnen, z.B. http://www.example.com/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "Piwik Pfad" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "Gib den Dateipfad zu Deiner Piwik-Installation an, z.B. /var/www/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "Piwik-Subdomain" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "Gib Deine InnoCraft Cloud Subdomain an. Sie ist Teil der URL: https://SUBDOMAIN.innocraft.cloud." + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "Auth Token" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "Gib hier Dein Piwik Auth Token an. Es ist ein alphanumerische Code wie 0a1b2c34d56e78901fa2bc3d45678efa." + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "Siehe %sdie WP-Piwik FAQ%s" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "Auto-Konfiguration" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "Aktiviere diesen Haken, um Dein Blog über seine URL automatisch aus Deinen Piwik-Seiten auszuwählen. Wenn Dein Blog bisher nicht zu Piwik hinzugefügt wurde, wird WP-Piwik eine neue Seite hinzufügen." + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "WP-Piwik %s konnte keine Seiten finden, für die zumindest View-Zugriff eingerichtet ist:
%s" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "Ermittelte Seite" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "Wähle die Seite" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "Piwik Standard-Datum" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "Heute" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "Gestern" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "Aktueller Monat" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "Letzter Monat" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "Aktuelle Woche" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "Letzte Woche" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "Default-Datum, das auf der Statistik-Seite gezeigt wird." + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "Zeige SEO-Daten" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "Zeige SEO-Ranking-Daten auf der Statistiken-Seite." + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "Langsam!" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "E-Commerce Daten anzeigen" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "Zeige E-Commerce Daten auf der Statistik-Seite an." + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "Dashboard Übersicht" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "Deaktiviert" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "Letzte 30 Tage" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "Aktiviere das WP-Piwik Dashboard Widget "Übersicht"." + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "Dashboard-Graph" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "Aktiviere das WP-Piwik Dashboard Widget "Graph"." + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "Dashboard SEO" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "Aktiviere das WP-Piwik Dashboard Widget "SEO"." + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "Dashboard E-Commerce" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "Aktiviere das WP-Piwik Dashboard Widget "E-Commerce"." + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "Zeige einen Graphen in der WordPress Toolbar" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "Zeige einen Besuchergraph der letzten 30 Tage in der WordPress' Toolbar." + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "Zeige Statistiken für" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "Wähle diejenigen Nutzerrollen, die sich die Statistiken ansehen dürfen." + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "Zeige Beitrags-Statistiken" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "Zeige Statistiken zu einzelnen Beiträgen auf der Bearbeiten-Seite." + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "Piwik-Verlinkung" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "Zeigt einen Shortcut zu Piwik an." + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "Anzeigename für WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "Der Name, mit dem das Plugin in WordPress angezeigt wird." + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "Aktiviere Shortcodes" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "Aktiviere Shortcodes innerhalb von Artikeln und Seiten." + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "Du kannst zwischen vier Tracking-Code-Varianten wählen:" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "WP-Piwik wird den Tracking-Code nicht hinzufügen. Benutze dies, wenn Du den Tracking-Code direkt in Deinem Template oder über ein anderes Plugin einfügen willst." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "Standard-Tracking" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "WP-Piwik verwendet den Standard Tracking-Code von Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "Nutze js/index.php" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "Du kannst diesen Tracking-Code wählen, um einen minimierten Proxy-Code auszuliefern und dabei zu vermeiden, dass die Dateien mit dem Namen piwik.js oder piwik.php verwendet werden." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "Siehe %sReadme-Datei%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "Verwende Proxy-Skript" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "Verwende diesen Tracking-Code, um die URL zu Deinem Piwik-Sever nicht offenzulegen." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "Siehe %sPiwik FAQ%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "Manuelle Eingabe" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "Gebe manuell Deinen eigenen Tracking-Code ein. Du kannst eine der vorhergehenden Optionen nutzen, Deinen Tracking-Code vorkonfigurieren und abschließend auf die manuelle Bearbeitung wechseln." + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "Verwende den Platzhalter {ID}, um Piwiks Site-ID einzufügen." + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "Tracking-Code einfügen" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "Tracking-Code" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "Position des JavaScript-Codes" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "Fußbereich" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "Kopfbereich" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "Wähle, ob der JavaScript-Code im Footer oder im Header eingefügt werden soll." + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "Noscript-Code" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "Füge <noscript> hinzu" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "Fügt den <noscript>-Code im Footer ein." + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "Im Proxy-Modus deaktiviert." + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "Füge rec-Parameter zum noscript Code hinzu" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "Aktiviere das Tracking für Besucher ohne JavaScript (nicht empfohlen)." + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "Aktiviere Content-Tracking" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "Tracke alle Content-Bereiche" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "Tracke nur sichtbare Content-Bereiche" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "Das Content-Tracking erlaubt es Dir, Interaktionen mit dem Inhalt einer Webseite oder -anwendung zu tracken." + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "Siehe %sPiwik-Dokumentation%s." + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "Tracke Suchanfragen" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "Nutze Piwiks Site Search Funktion, um interne Suchen zu tracken." + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "404-Tracking" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "WP-Piwik kann automatisch eine eigene Kategorie für 404-Seiten hinzufügen." + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "Notiz bei neuen Posts von folgenden Typen" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "Zeige Custom-Variables-Box" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "Zeige eine Eingabebox für "custom variables" auf der Seite zum Bearbeiten von Posts." + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "Füge weitere Dateiendungen für das Download-Tracking hinzu" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "Füge Dateiendungen zum Download-Tracking hinzu. Trenne mehrere Erweiterung durch einen senkrechten Strich (|)." + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "Cookies deaktivieren" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "Schalte alle Tracking-Cookies für Besucher ab." + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "Cookie-Lebensdauer beschränken" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "Du kannst die Cookie-Lebenszeit begrenzen, um Deine Besucher nicht länger als notwendig zu tracken." + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "Besucher-Timeout (Sekunden)" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "Session-Timeout (Sekunden)" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "Referral-Timeout (Sekunden)" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "Admin-Seiten tracken" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "Aktivieren, um Nutzer auf Admin-Seiten zu zählen (bitte den Tracking Filter entsprechend konfigurieren)." + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "Tracking-Filter" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "Wähle diejenigen Nutzerrollen, die Du nicht erfassen willst." + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "Tracke Subdomains innerhalb der gleichen Webseite" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "Fügt ein *.-Präfix zur Cookie Domain hinzu." + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "Werte Subdomains nicht als ausgehenden Link" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "Fügt ein *.-Präfix zur getrackten Domain hinzu." + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "Aktiviere Cross-Domain-Verlinkung" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "Wenn aktiviert, stellt die Funktion sicher, dass die gleiche Besucher-ID für den gleichen Besucher über mehrere Domains hinweg benutzt wird. Dies funktioniert nur, wenn die Funktion aktiviert ist, da die Besucher-ID in einem Cookie gespeichert wird und somit nicht auf einer anderen Domain gelesen werden kann. Über diese Funktion wird der URL der Parameter \"pk_vid\" hinzugefügt, der die Besucher-ID enthält, sobald ein Nutzer auf eine URL klickt, die zu Deinen Domains gehört. Damit es funktioniert, müssen die als lokal zu betrachtenden Domains auch in den Piwik Webseiten-Einstellungen konfiguriert sein. Die Funktion erfordert zumindest Piwik 3.0.2." + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "Tracke RSS-Feeds" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "Aktivieren, um Beiräge im Feed via Tracking-Pixel zu zählen." + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "Links in RSS-Feeds als Kampagne tracken" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "Dies fügt einen Piwik-Kampagnen-Parameter zu den RSS-Feed-Links hinzu." + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "RSS-Feed Kampagne" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "Schlüsselwort: Name des Beitrags." + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "Aktiviere Heartbeat-Timer" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "Aktiviere den Heratbeat-Timer, um genauere Besuchszeiten zu erhalten, indem HTTP-Ping-Anfragen gesendet werden, solange die Seite geöffnet ist. Gib den Zeitabstand zwischen den Ping-Anfragen in Sekunden (Piwik-Default: 15) an oder trage 0 zum deaktivieren ein. Hinweis: Dadurch entsteht eine Vielzahl zusätzlicher HTTP-Anfragen an Deine Seite." + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "Nutzer-ID Tracking" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "WP User ID" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "E-Mail-Adresse" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "Benutzername" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "Anzeigename (nicht empfohlen)" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "Wenn Nutzer in WordPress eingeloggt ist, tracked WP-Piwik deren "User ID". Du kannst wählen, welches Feld des Nutzerprofils dabei als "User ID" verwendet wird. Wenn die Funktion aktiviert wird, empfiehlt sich das Tracking auf Basis der E-Mail-Adresse." + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "Normalerweise solltest Du diese Einstellungen nicht ändern müssen. Solltest Du hier doch etwas ändern wollen, solltest Du wissen was Du tust oder dies auf Anleitung eines Experten tun." + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "Cache einschalten" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "Cache API-Anfragen, die keine heutigen Werte enthalten, für eine Woche." + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "HTTP-Verbindung über" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "cURL" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "fopen" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "Wähle, ob WP-Piwik cURL oder dopen verwenden soll, um im HTTP oder Cloud Modus mit Piwik zu verbinden." + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "HTTP-Methode" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "POST" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "GET" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "Wähle, ob WP-Piwik POST oder GET im HTTP oder Cloud Modus verwenden soll." + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "Zeitlimit deaktivieren" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "Verwende set_time_limit(0) falls die Statistik-Seite einen Timeout erzeugt." + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "Verbindungs-Timeout" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "SSL Peer-Verifikation deaktivieren" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "Nicht empfohlen" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "SSL-Host-Verifizierung deaktivieren" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "User Agent" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "Verwende den PHP-Standard User-Agent" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "leer" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "Lege einen spezifischen User-Agent fest" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "Spezifischer User-Agent" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "Aktiviere DNS-Prefetch" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "Siehe %sPiwik Blog%s." + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "Fügt einen DNS-Prefetch-Tag hinzu." + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "data-cfasync=false einfügen" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "Siehe %sdie CloudFlare Knowledge Base%s." + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "Füge data-cfasync=false zum Script-Tag hinzu. Damit wird z.B. Rocket Loader aufgefordert, das Skript zu ignorieren." + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "CDN URL" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "CDN URL (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "Zwinge Piwik, ein bestimmtes Protokoll zu verwenden" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "Deaktiviert (Standard)" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "http" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "https (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "Wähle aus, ob Du Piwik ausdrücklich zwingen willst, HTTP oder HTTPS zu verwenden. Funktioniert nicht mit einer CDN URL." + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "Update-Hinweis" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "Immer anzeigen, wenn WP-Piwik aktualisiert wurde" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "Immer anzeigen, wenn WP-Piwik aktualisiert und dabei die Konfiguration geändert wurde" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "Wähole aus, ob Du einen Hinweis erhalten möchtest, wenn WP-Piwik aktualisiert wurde." + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "Lege alle Dateiendungen für das Download-Tracking fest" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "Ersetze Piwiks Standard-Dateiendungen für das Download-Tracking, getrennt durch einen senkrechten Strich (|). Lasse dieses Feld frei, um die Standard-Einstellungen von Piwik zu erhalten." + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "Lege die Klassen fest, die als Download behandelt werden sollen." + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "Lege die Klassen fest, die (zusätzlich zu piwik_download) als Download behandelt werden sollen. Trenne mehrere Klassen durch einen senkrechten Strich (|). Lasse dieses Feld frei, um die Standard-Einstellungen von Piwik zu erhalten." + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "Siehe %sPiwik JavaScript Tracking Client Referenz%s." + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "Lege die Klassen fest, die als ausgehender Link behandelt werden sollen" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "Lege die Klassen fest, die (zusätzlich zu piwik_link) als ausgehender Link behandelt werden sollen. Trenne mehrere Klassen durch einen senkrechten Strich (|). Lasse dieses Feld frei, um die Standard-Einstellungen von Piwik zu erhalten." + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "Spenden" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "Wenn Dir WP-Piwik gefällt, kannst Du die weitere Entwicklung mit einer Spende fördern:" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "Meine Wunschliste bei Amazon.de" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "Bitte denke daran, eine Kompatibilitätsbewertung abzugeben:" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "Vielen Dank für eure Spenden" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "das Piwik-Team selbst" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr " und allen, die WP-Piwik flattrn" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "Graphen erstellt mit jqPlot (Lizenz: GPL 2.0 and MIT) und jQuery Sparklines (Lizenz: New BSD License)." + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "Vielen Dank" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "für eure Übersetzungsarbeit" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "Vielen Dank an alle Nutzer, die mir Mails mit Kritik, Lob, Featurewünsche und Bugmeldungen senden. Ihr helft mir dabei, WP-Piwik viel besser zu machen." + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "Vielen Dank an Dich für die Nutzung meines Plugins. Es ist das größte Lob, wenn mein Code tatsächlich benutzt wird!" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "Der beste Platz, um Hilfe zu bekommen:" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "WP-Piwik Support-Forum" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "Fehlersuche" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "Entweder allow_url_fopen muss aktiviert oder cURL muss verfügbar sein:" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "cURL ist" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "nicht" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "verfügbar" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "allow_url_fopen ist" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "aktiviert" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "wird verwendet." + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "Die ermittelte Piwik-Basis-URL ist" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "Tools" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "Testskript ausführen" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "Sitebrowser" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "Cache leeren" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "Bist Du Dir sicher, dass Du alle Einstellungen löschen willst?" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "WP-Piwik zurücksetzen" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "Die letzten Support-Beiträge auf WordPress.org" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "Einstellungen gelöscht (außer Verbindungsdaten)" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "Cache geleert." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "Seite" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "Seiten" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "Noch keine Seite konfiguriert." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "Blog ID" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "Titel" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "URL" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "Seiten-ID (Piwik)" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "Seite noch nicht erstellt." + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "Statistiken" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "Derzeit gezeigte Statistiken:" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "Keine Verbindung zu" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "realpath() gibt false zurück" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "Die Klasse Piwik\\FrontController existiert nicht." + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "Die Klasse Piwik\\API\\Request existiert nicht." + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "Piwik Custom Variables" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "Name" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "Wert" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "Definiere custom variables für einen Seitenaufruf." + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "Piwik-Fehler" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Unique" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Besuche" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "Aufrufe" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "Aktionen" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "Keine Daten vorhanden." + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "heute" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "aktueller Monat" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "letzter Monat" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "aktuelle Woche" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "letzte Woche" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "gestern" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "Woche" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "letzte 30 Tage" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "letzte 12" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "Browser-Details" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Browser" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Prozent" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "Andere" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "Browser" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Besucher" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "Der Graph zeigt die Werte aus der Besucher-Tabelle (Besucher / Unique / Absprünge). Die rote Linie zeigt eine lineare Trendlinie (Unique)." + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "Länder" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "Land" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "E-Commerce" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "Conversions" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "Besucher Conversions" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "Umsatz" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "Konversionsrate" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "Conversions (neue Besucher)" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "Conversions (neue Besucher)" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "Umsatz (neue Besucher)" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "Konversionsrate (neue Besucher)" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "Conversions (wiederkehrende Besucher)" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "Conversions (wiederkehrende Besucher)" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "Umsatz (wiederkehrende Besucher)" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "Konversionsrate (wiederkehrende Besucher))" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "Shortcut" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "E-Commerce Artikel" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "Bezeichnung" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "Anzahl" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "Bestellungen" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "Ø Preis" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "Ø Anzahl" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "E-Commerce Artikel-Kategorien" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Keywords" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "Seitensuche" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Keyword" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "Anfragen" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Absprünge" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Übersicht" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "Dashboard" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Eindeutige Besucher" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Page Views" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "Verbrachte Zeit" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Absprungrate" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "Zeit/Besuch" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Max. Seiten/Besuch" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "Seiten" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "Seite" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "Plugins" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "Plugin" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "Min. Zeit zur Generierung" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "Max. Zeit zur Generierung" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "Referrer" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "Auflösungen" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Auflösung" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "Betriebssystem-Details" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "Betriebssystem" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "Betriebssysteme" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Datum" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "Seitenansichten" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "WP-Piwik benötigt zumindest PHP 5.3. Du verwendest die veraltete Version %s. Bitte aktualisiere PHP um WP-Piwik zu nutzen." diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el.mo new file mode 100644 index 0000000000000000000000000000000000000000..d672b20230c7ba506bb281bb2031e3798a6c71fa GIT binary patch literal 38932 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 literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el.po b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el.po new file mode 100644 index 00000000..cfef717d --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el.po @@ -0,0 +1,1531 @@ +# +# Translators: +# André Bräkling , 2011 +# Vasilis Lourdas, 2016-2017 +# Vasilis Lourdas, 2015 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-15 18:39+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Greek (http://www.transifex.com/piwik/wp-piwik/language/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "Το %s %s εγκαταστάθηκε." + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "Στη συνέχεια συνδεθείτε με Piwik" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "Το %s ενημερώθηκε σε %s." + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "Παρακαλώ επαληθεύστε τη διαμόρφωση" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Ρυθμίσεις" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "Σημαντικό" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Piwik Στατιστικά" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "Παραμετροποίηση του WP-Piwik" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "Παρουσιάστηκε σφάλμα" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "Υποστήριξη" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "Κλέβεις, έτσι;" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "Επαναφόρτωση" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "Οι αλλαγές αποθηκεύθηκαν." + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "Ευχαριστούμε που χρησιμοποιείτε το WP-Piwik!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "Το WP-Piwik %s συνδέθηκε με επιτυχία στο Piwik %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "Τρέχετε το WordPress %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "Τρέχετε ένα δίκτυο ιστολογίων (WPMU) WordPress %s. Το WP-Piwik θα χειρίζεται όλους τους ιστοτόπους σας ως διαφορετικούς." + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "Το WP-Piwik %s δεν μπόρεσε να συνδεθεί με το Piwik χρησιμοποιώντας τις ρυθμίσεις σας. Δείτε την παρακάτω παράγραφο %raquo;Σύνδεση με το Piwik«." + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "Το WP-Piwik δεν ήταν δυνατό να συνδεθεί με το Piwik χρησιμοποιώντας την παραμετροποίησή σας. Κατά την σύνδεση, συνέβη το εξής σφάλμα:
%s" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "Το WP-Piwik %s πρέπει να συνδεθεί πρώτα με το Piwik. Ελέγξτε το τμήμα »Σύνδεση με το Piwik« παρακάτω." + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Σύνδεση με το Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "Εμφάνιση στατιστικών" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "Ενεργοποίηση παρακολούθησης" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "Ρυθμίσεις για προχωρημένους" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "Συντελεστές" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "Το WP-Piwik είναι ένα πρόσθετο για το WordPress για να εμφανίζει μια επιλογή από στατιστικά του Piwik στον πίνακα διαχείρισης του WordPress και για να προσθέτετε και παραμετροποιείτε τον κώδικα παρακολούθησης του Piwik. Αν δεν έχετε ήδη κάποια εγκατάσταση του Piwik, έχετε δύο απλές επιλογές: να χρησιμοποιήσετε είτε" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "ένα Piwik στημένο τοπικά" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "ή" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "ένα Piwik στημένο στο σύννεφο από την InnoCraft" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "Ούτε το cURL ούτε η fopen είναι διαθέσιμα. Έτσι, το WP-Piwik δεν μπορεί να χρησιμοποιήσει το HTTP API και να συνδεθεί με το σύννεφο InnoCraft." + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "Περισσότερες πληροφορίες" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "Μπορείτε να επιλέξετε μεταξύ των τριών τρόπων σύνδεσης:" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "Φιλοξενία σε εσάς (HTTP API, εξ' ορισμού)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "Αυτή είναι η προκαθορισμένη επιλογή για Piwik που φιλοξενείται σε εσάς και αναμένεται να δουλέψει για τις περισσότερες εγκαταστάσεις. Το WP-Piwik θα συνδεθεί με το Piwik με χρήση http(s)." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "Φιλοξενία σε εσάς (PHP API)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "Επιλέξτε αυτή την επιλογή, αν το Piwik που φιλοξενείται σε εσάς και το WordPress εκτελούνται στον ίδιο διακομιστή και γνωρίζετε την πλήρη διαδρομή για το στιγμιότυπο του Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "Στημένο στο σύννεφο (Σύννεφο InnoCraft)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Κατάσταση του Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "Ανενεργό (το WP-Piwik δεν συνδέεται με το Piwik)" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Piwik URL" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "Εισάγετε τη διεύθυνση URL του Piwik. Αυτή είναι η ίδια διεύθυνση URL που χρησιμοποιείτε για να προσπελάσετε το στιγμιότυπο Piwik σας, πχ. http://www.example.com/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "Διαδρομή του Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "Εισάγετε την πλήρη διαδρομή για το στιγμιότυπο του Piwik σας, πχ. /var/www/piwik." + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "Υποόνομα χώρου Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "Σύμβολο γνησιότητας" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "Εισάγετε εδώ τον κωδικό πιστοποίησης του Piwik. Είναι ένας αλφαριθμητικός κωδικός σαν το 0a1b2c34d56e78901fa2bc3d45678efa." + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "Δείτε τις %sΣυχνές ερωταπαντήσεις του WP-Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "Αυτόματη ρύθμιση" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "Επιλέξτε αυτό για να γίνεται αυτόματη επιλογή του ιστολογίου σας από τους ιστοτόπους σας του Piwik με τη διεύθυνση URL. Αν το ιστολόγιό σας δεν έχει προστεθεί ακόμη, το WP-Piwik θα προσθέσει αυτόματα ένα νέο ιστοτόπο." + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "Ιστοτόπος που εντοπίστηκε" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "Επιλέξτε ιστοτόπο" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "Προκαθορισμένη ημερομηνία Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "Σήμερα" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "Εχθές" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "Τρέχων μήνας" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "Προηγούμενος μήνας" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "Τρέχουσα εβδομάδα" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "Προηγούμενη εβδομάδα" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "Προεπιλεγμένη ημερομηνία που αναγράφεται στη σελίδα των στατιστικών." + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "Εμφάνιση των δεδομένων SEO" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "Εμφάνιση των δεδομένων κατάταξης SEO στη σελίδα στατιστικών." + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "Αργό!" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "Σύνοψη πίνακα" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "Ανενεργό" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "Προηγούμενες 30 ημέρες" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "Ενεργοποίηση της "Σύνοψης" του πίνακα του γραφικού συστατικού WP-Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "Γράφημα πίνακα" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "Ενεργοποίηση του "γραφικού" συστατικού πίνακα του WP-Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "SEO πίνακα" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "Ενεργοποίηση του γραφικού συστατικού "SEO" του πίνακα ελέγχου του WP-Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "Εμφάνιση γραφήματος στην μπάρα εργαλείων του WordPress" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "Εμφάνιση του γραφήματος επισκέψεων για τις τελευταίες 30 ημέρες στην μπάρα εργαλείων του WordPress." + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "Εμφάνιση στατιστικών σε" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "Επιλέξτε τους ρόλους χρηστών, οι οποίοι επιτρέπεται να βλέπουν τα στατιστικά." + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "Εμφάνιση στατιστικών ανά καταχώρηση" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "Εμφάνιση στατιστικών για μεμονωμένες καταχωρήσεις στη σελίδα διαχείρισης της καταχώρησης." + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "Συντόμευση Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "Εμφάνιση μιας συντόμευσης προς Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "Εμφανιζόμενο όνομα WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "Το όνομα του πρόσθετου που θα εμφανίζεται στο WordPress." + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "Ενεργοποίηση σύντομων κωδικών" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "Ενεργοποίηση σύντομων κωδικών στο περιεχόμενο καταχωρήσεων ή σελίδων." + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "Μπορείτε να επιλέξετε μεταξύ τεσσάρων καταστάσεων κωδικών παρακολούθησης:" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "Το WP-Piwik δεν θα προσθέσει τον κώδικα παρακολούθησης. Χρησιμοποιήστε το αυτό, αν θέλετε να προσθέτετε τον κώδικα παρακολούθησης στα αρχεία προτύπων ή χρησιμοποιείτε κάποιο άλλο πρόσθετο για την προσθήκη του κώδικα." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "Προκαθορισμένη παρακολούθηση" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "Το WP-Piwik θα χρησιμοποιήσει τον προκαθορισμένο κώδικα παρακολούθησης του Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "Χρήση του js/index.php" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "Μπορείτε να επιλέξετε αυτό τον κώδικα παρακολούθησης, για να παρέχετε ένα ελαχιστοποιημένο σε μέγεθος κώδικα μεσολαβητή και να αποφύγετε την χρήση των αρχείων piwik.js ή piwik.php." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "Δείτε το %sαρχείο readme%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "Χρήση σεναρίου διαμεσολαβητή" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "Χρησιμοποιήστε αυτό τον κώδικα παρακολούθησης για να μην αποκαλύπτετε τη διεύθυνση URL του Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "Δείτε τις %sσυχνές ερωταπαντήσεις του Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "Εισάγετε χειροκίνητα" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "Εισάγετε μόνοι σας τον κώδικα παρακολούθησης. Μπορείτε να επιλέξετε μία από τις προηγούμενες επιλογές, να προρυθμίσετε τον κώδικά σας και τέλος να μεταβείτε σε κατάσταση επεξεργασίας." + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "Χρήση του κωδικού (ID) για την προσθήκη του αναγνωριστικού ιστοτόπου του Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "Προσθήκη κώδικα παρακολούθησης" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "Κώδικας παρακολούθησης" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "Θέση του κώδικα JavaScript" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "Υποσέλιδο" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "Κεφαλίδα" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "Επιλέξτε αν ο κώδικας JavaScript θα προστίθεται στο υποσέλιδο ή την κεφαλίδα." + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "Κώδικας noscript" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "Προσθήκη του <noscript>" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "Προσθέτει τον κώδικα <noscript> στο υποσέλιδο." + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "Απενεργοποιημένο σε κατάσταση διαμεσολαβητή." + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "Προσθήκη παραμέτρου rec στον κώδικα noscript" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "Να ενεργοποιηθεί η παρακολούθηση για επισκέπτες χωρίς JavaScript (δεν προτείνεται)." + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "Ενεργοποίηση παρακολούθησης περιεχομένου" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "Να παρακολουθούνται όλα τα μπλοκ περιεχομένου" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "Να παρακολουθούνται μόνο τα ορατά μπλοκ" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "Η παρακολούθηση περιεχομένου σας επιτρέπει να παρακολουθείτε την αλληλεπίδραση με το περιεχόμενο μιας ιστοσελίδας ή εφαρμογής." + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "Δείτε την %sτεκμηρίωση του Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "Παρακολούθηση της αναζήτησης" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "Να γίνεται χρήση του χαρακτηριστικού των προχωρημένων Αναλυτικών Αναζήτησης Ιστοτόπου." + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "Παρακολούθηση 404" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "Το WP-Piwik μπορεί να προσθέτει αυτόματα μια 404-κατηγορία για να παρακολουθούνται οι επισκέψεις 404." + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "Εμφάνιση του κουτιού προσαρμοσμένων μεταβλητών" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "Να εμφανίζεται ένα κουτί επεξεργασίας "προσαρμοσμένων μεταβλητών" στη σελίδα επεξεργασίας της καταχώρησης." + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "Προσθήκη νέων τύπων αρχείων για την παρακολούθηση των κατεβασμάτων" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "Προσθήκη επεκτάσεων αρχείων για την παρακολούθηση των κατεβασμάτων, χωρισμένα με τον χαρακτήρας της κάθετης μπάρας (|)." + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "Απενεργοποίηση των cookies" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "Απενεργοποίηση όλων των cookies παρακολούθησης για ένα επισκέπτη." + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "Περιορισμός του χρόνου ζωής των cookies" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "Μπορείτε να περιορίσετε το χρονικό όριο ισχύος των cookies για να μην παρακολουθείτετους χρήστες σας για ένα συγκεκριμένο χρονικό διάστημα όπως απαιτείται." + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "Χρόνος λήξης επισκεπτών (δευτερόλεπτα)" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "Χρόνος λήξης συνόδου (δευτερόλεπτα)" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "Χρονικό όριο αναφορέα (δευτερόλεπτα)" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "Παρακολούθηση των σελίδων διαχείρισης" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "Ενεργοποιήστε για να παρακολουθείτε τους χρήστες στις σελίδες διαχείρισης (θυμηθείτε να ρυθμίσετε ανάλογα το φίλτρο παρακολούθησης)." + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "Φίλτρο Παρακολούθησης" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "Επιλέξτε το ρόλο χρήστη, τον οποίο δε θέλετε να παρακολουθήσετε." + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "Να παρακολουθούνται τα υπο-ονόματα χώρου στον ίδιο ιστοτόπο" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "Προσθέτει την κατάληξη *.-prefix στα cookies ονομάτων χώρου." + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "Να μην μετρώνται τα υπο-ονόματα χώρου ως εξωτερικοί σύνδεσμοι" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "Προσθέτει το πρόθεμα *.-prefix στον ιστοτόπο που παρακολουθείται." + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "Παρακολούθηση των δεδομένων ροών RSS" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "Ενεργοποίηση της παρακολούθησης των καταχωρήσεων στις ροές μέσω ενός pixel παρακολούθησης." + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "Παρακολούθηση των συνδέσμων ροών RSS ως καμπάνια" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "Καμπάνια ροών RSS" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "Λέξη κλειδί: όνομα καταχώρησης." + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "Εμφάνιση χρονομετρητή παλμού" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "Ενεργοποίηση ενός μετρητή παλμού για την λήψη ακριβέστερων μετρήσεων επισκέψεων με την αποστολή περιοδικών αιτήσεων HTTP ping όσο ο ιστοτόπος είναι σε λειτουργία. Εισάγετε το χρόνο μεταξύ των ping σε δευτερόλεπτα (προκαθορισμένο για το Piwik: 15 δευτερόλεπτα) για να το ενεργοποιήσετε ή 0 για απενεργοποίηση του χαρακτηριστικού αυτού. Σημείωση: Το χαρακτηριστικό αυτό θα προκαλεί αρκετές πρόσθετες αιτήσεις HTTP στον ιστοτόπο σας." + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "Αναγνωριστικό ανίχνευσης χρήστη" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "Αναγνωριστικό χρήστη WP" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "Διεύθυνση ηλ. ταχυδρομείου" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "Όνομα χρήστη" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "Εμφανιζόμενο όνομα (δεν προτείνεται!)" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "Όταν ένας χρήστης κάνει είσοδο στο WordPress, παρακολουθήστε το "Αναγνωριστικό Χρήστη" του. Μπορείτε να επιλέξετε ποιο πεδίο από το προφίλ χρήστη θα χρησιμοποιείται ως το "Αναγνωριστικό χρήστη". Όταν είναι ενεργό, προτείνεται η παρακολούθηση βάσει της διεύθυνσης ηλ. ταχυδρομείου." + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "Συνήθως, δε χρειάζεται να αλλάξετε αυτές τις ρυθμίσεις. Αν επιθυμείτε να το κάνετε, θα πρέπει να γνωρίζετε τι κάνετε ή να πάρετε τη γνώμη ενός ειδικού." + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "Ενεργοποίηση λανθάνουσας μνήμης" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "Οι κλήσεις API, που δεν περιέχουν τις σημερινές τιμές, να μπαίνουν στη λανθάνουσα μνήμη για μια εβδομάδα." + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "Σύνδεση HTTP μέσω" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "cURL" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "fopen" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "Μέθοδος HTTP" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "POST" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "GET" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "Απενεργοποίηση χρονικού ορίου" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "Χρήση της set_time_limit(0) αν η σελίδα στατιστικών προκαλέσει υπέρβαση χρονικού ορίου." + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "Χρονικό όριο" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "Απενεργοποίηση της ομότιμης επαλήθευσης SSL" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "δε συνίσταται" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "Απενεργοποίηση της επαλήθευσης του διακομιστή SSL" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "Πρόγραμμα πελάτης" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "Χρήση του προκαθορισμένου πράκτορα χρήστη της PHP" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "κενό" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "Ορισμός συγκεκριμένου πράκτορα χρήστη" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "Συγκεκριμένος πράκτορας χρήστη" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "Προσθήκη του data-cfasync=false" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "Διεύθυνση URL του CDN" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "Διεύθυνση URL του CDN (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "Να χρησιμοποιεί το Piwik συγκεκριμένο πρωτόκολλο" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "Απενεργοποιημένο (εξ' ορισμού)" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "http" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "https (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "Επιλέξτε αν θέλετε να υποχρεώσετε το Piwik να χρησιμοποιεί HTTP ή HTTPS. Δεν δουλεύει με διεύθυνση URL για CDN." + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "Σημείωση αναβάθμισης" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "Εμφάνιση πάντα αν το WP-Piwik ενημερώνεται" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "Εμφάνιση μόνο αν το WP-Piwik ενημερώνεται και οι ρυθμίσεις του έχουν αλλάξει" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "Επιλέξτε αν επιθυμείτε να λαμβάνετε ενημέρωση για το αν το WP-Piwik ενημερώνεται." + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "Ορίστε όλους τους τύπους αρχείων για την παρακολούθηση των μεταφορτώσεων" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "Αντικαταστήστε τους προκαθορισμένους τύπους αρχείων για την παρακολούθηση μεταφορτώσεων, χωρισμένους με μια κάθετη μπάρα (|). Αφήστε το κενό για να κρατηθούν οι προκαθορισμένες ρυθμίσεις του Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "Δωρήστε" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "Αν σας αρέσει το WP-Piwik, μπορείτε να στηρίξετε την ανάπτυξή του με μια δωρεά:" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "Η λίστα επιθυμίας μου στο Amazon.de" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "Παρακαλούμε μην ξεχάσετε να ψηφίσετε για την συμβατότητα στο" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "Ευχαριστώ για τις δωρεές" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "η ομάδα του Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr " και όλοι οι άνθρωποι που το επαινούν" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "Ευχαριστώ πολύ" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "για τη μετάφραση" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "Σας ευχαριστώ πολύ, όλους τους χρήστες που μου στείλατε μηνύματα που περιέχουν κριτική, επιδοκιμασία, αιτήματα για νέες λειτουργίες και αναφορές σφαλμάτων! Βοηθάτε να γίνει το WP-piwik πολύ καλύτερο." + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "Σας ευχαριστώ για τη χρήση του plugin μου. Είναι ο καλύτερος έπαινος, αν ο κώδικάς μου χρησιμοποιείται πραγματικά!" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "Το καλύτερο μέρος για βοήθεια:" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "Φόρουμ υποστήριξης για το WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "Αποσφαλμάτωση" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "Είτε το allow_url_fopen πρέπει να είναι ενεργοποιημένο είτε το cURL να είναι διαθέσιμο:" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "Το cURL είναι" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "μη" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "διαθέσιμο" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "Το allow_url_fopen είναι" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "ενεργοποιημένο" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "χρησιμοποιείται." + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "Η βασική διεύθυνση URL για το Piwik καθορίστηκε σε" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "Εργαλεία" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "Εκτέλεση του σεναρίου δοκιμής" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "Περιηγητής ιστοτόπου" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "Καθαρισμός της λανθάνουσας μνήμης" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "Είστε σίγουροι για τον καθαρισμό όλων των ρυθμίσεων;" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "Αρχικοποίηση του WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "Τα τελευταία θέματα για υποστήριξη στο WordPress.org" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "Οι ρυθμίσεις καθαρίστηκαν (εκτός από τις ρυθμίσεις σύνδεσης)." + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "Η λανθάνουσα μνήμη διαγράφηκε." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "ιστοτόπος" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "ιστοτόποι" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "Δεν έχει παραμετροποιηθεί ακόμη ιστοτόπος." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "Αναγνωριστικό ιστολογήματος" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "Τίτλος" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "Διεύθυνση URL" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "Αναγνωριστικό ιστοτόπου (Piwik)" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "Ο ιστοτόπος δεν έχει ακόμη δημιουργηθεί." + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "Στατιστικά" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "Τρέχουσα προβολή στατιστικών:" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "Δεν ήταν δυνατή η επίλυση" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "Το realpath() επιστρέφει ψευδές" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "Δεν υπάρχει η κλάση Piwik\\FrontController." + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "Δεν υπάρχει η κλάση Piwik\\API\\Request." + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "Προσαρμοσμένες Μεταβλητές του Piwik" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "Όνομα" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "Τιμή" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "Ορισμός προσαρμοσμένων μεταβλητών για εμφάνιση σελίδας" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "Σφάλμα του Piwik" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Μοναδικοί" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Επισκέψεις" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "Επισκέψεις" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "Ενέργειες" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "Δεν υπάρχουν διαθέσιμα στοιχεία." + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "σήμερα" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "τρέχων μήνας" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "προηγούμενος μήνας" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "τρέχουσα εβδομάδα" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "προηγούμενη εβδομάδα" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "χθες" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "εβδομάδα" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "τελευταίες 30 ημέρες" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "τελευταία 12" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "Λεπτομέρειες προγράμματος πλοήγησης" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Browser" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Τοις εκατό" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "Άλλοι" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "Προγράμματα πλοήγησης" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Επισκέπτες" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "Το γράφημα περιέχει τις τιμές που εμφανίζονται στον πίνακα παρακάτω (επισκέπτες / μοναδικοί /αναπηδήσεις). Η κόκκινη γραμμή δείχνει μια γραμμική τάση (μοναδική)." + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "Χώρες" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "Χώρα" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "Μετατροπές" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "Πρόσοδος" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "Συντόμευση" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "Ετικέτα" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "Ποσότητα" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "Παραγγελίες" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Λέξεις κλειδιά" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "Αναζήτηση ιστοτόπου" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Λέξη κλειδί" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "Αιτήσεις" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Εγκατέλειψαν" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Επισκόπηση" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "κεντρικός πίνακας" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Μοναδικοί επισκέπτες" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Προβολές σελίδων" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "Συνολικός χρόνος" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Αριθμός που εγκατέλειψαν" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "Χρόνος/Επίσκεψη" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Ανώτατο όριο προβολών σελίδων σε μια επίσκεψη" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "Σελίδες" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "Σελίδα" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "Plugins" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "Πρόσθετο" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "Ελάχιστος χρόνος δημιουργίας" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "Μέγιστος χρόνος δημιουργίας" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "Αναφορείς" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "Αναλύσεις" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Ανάλυση" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "Λεπτομέρειες Συστήματος Ενεργειών" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "Σύστημα ενέργειας" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "Συστήματα ενεργειών" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Ημερομηνία" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "Εμφανίσεις σελίδας" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "Το WP-Piwik απαιτεί τουλάχιστον PHP 5.3. Χρησιμοποιείτε την παρωχημένη έκδοση %s. Παρακαλώ αναβαθμίστε την PHP για να εκτελείται το WP-Piwik." diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el_GR.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-el_GR.mo new file mode 100644 index 0000000000000000000000000000000000000000..802a4883e7a43afc5ec0a46f03e2a04db9c7b14c GIT binary patch literal 13103 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, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik 0.8.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-piwik\n" +"POT-Creation-Date: 2010-07-19 18:06+0000\n" +"PO-Revision-Date: 2011-04-29 20:30+0200\n" +"Last-Translator: Harry \n" +"Language-Team: AggelioPolis.gr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Greek\n" +"X-Poedit-Country: GREECE\n" + +#: dashboard/browsers.php:12 +#: dashboard/browsers.php:33 +msgid "Browser" +msgstr "Browser" + +#: dashboard/browsers.php:22 +#: dashboard/pages.php:43 +#: dashboard/screens.php:22 +#: dashboard/systems.php:22 +msgid "Others" +msgstr "Άλλοι" + +#: dashboard/browsers.php:34 +#: dashboard/keywords.php:17 +#: dashboard/pages.php:22 +#: dashboard/screens.php:33 +#: dashboard/systems.php:35 +#: dashboard/visitors.php:53 +#: dashboard/websites.php:19 +#: wp-piwik.php:305 +msgid "Unique" +msgstr "Μοναδικοί" + +#: dashboard/browsers.php:35 +#: dashboard/plugins.php:33 +#: dashboard/screens.php:34 +#: dashboard/systems.php:36 +msgid "Percent" +msgstr "Τοις εκατό" + +#: dashboard/keywords.php:12 +msgid "Keywords" +msgstr "Λέξεις κλειδιά" + +#: dashboard/keywords.php:17 +msgid "Keyword" +msgstr "Λέξη κλειδί" + +#: dashboard/overview.php:12 +msgid "Overview" +msgstr "Επισκόπηση" + +#: dashboard/overview.php:42 +#: dashboard/visitors.php:24 +msgid "Visitors" +msgstr "Επισκέπτες" + +#: dashboard/overview.php:43 +msgid "Unique visitors" +msgstr "Μοναδικοί επισκέπτες" + +#: dashboard/overview.php:44 +msgid "Page views" +msgstr "Προβολές σελίδων" + +#: dashboard/overview.php:45 +msgid "Max. page views in one visit" +msgstr "Ανώτατο όριο προβολών σελίδων σε μια επίσκεψη" + +#: dashboard/overview.php:46 +msgid "Total time spent" +msgstr "Συνολικός χρόνος" + +msgid "Time/visit" +msgstr "Χρόνος/Επίσκεψη" + +#: dashboard/overview.php:47 +msgid "Bounce count" +msgstr "Αριθμός που εγκατέλειψαν" + +#: dashboard/overview.php:49 +#: wp-piwik.php:563 +msgid "Shortcut" +msgstr "Συντόμευση" + +#: dashboard/pages.php:13 +msgid "Pages" +msgstr "Σελίδες" + +#: dashboard/pages.php:21 +msgid "Page" +msgstr "Σελίδα" + +#: dashboard/pages.php:23 +#: dashboard/plugins.php:32 +#: dashboard/visitors.php:52 +msgid "Visits" +msgstr "Επισκέψεις" + +#: dashboard/plugins.php:12 +#: dashboard/plugins.php:31 +msgid "Plugins" +msgstr "Plugins" + +#: dashboard/screens.php:12 +#: dashboard/screens.php:32 +msgid "Resolution" +msgstr "Ανάλυση" + +#: dashboard/systems.php:12 +#: dashboard/systems.php:34 +msgid "Operating System" +msgstr "Λειτουργικό Σύστημα" + +#: dashboard/visitors.php:51 +msgid "Date" +msgstr "Ημερομηνία" + +#: dashboard/visitors.php:54 +msgid "Bounced" +msgstr "Εγκατέλειψαν" + +#: dashboard/visitors.php:67 +msgid "Unique TOTAL" +msgstr "Unique ΆΘΡΟΙΣΜΑ" + +#: dashboard/visitors.php:67 +msgid "Sum" +msgstr "Άθροισμα" + +#: dashboard/visitors.php:67 +msgid "Avg" +msgstr "Μέσος Όρος" + +#: dashboard/websites.php:12 +msgid "Websites" +msgstr "Ιστοσελίδες" + +#: dashboard/websites.php:18 +msgid "Website" +msgstr "Ιστοσελίδα" + +#: wp-piwik.php:110 +#: wp-piwik.php:365 +msgid "Piwik Statistics" +msgstr "Piwik Στατιστικά" + +#. #-#-#-#-# plugin.pot (WP-Piwik 0.8.0) #-#-#-#-# +#. Plugin Name of the plugin/theme +#: wp-piwik.php:111 +#: wp-piwik.php:122 +#: wp-piwik.php:123 +#: wp-piwik.php:146 +msgid "WP-Piwik" +msgstr "WP-Piwik" + +#: wp-piwik.php:130 +#: wp-piwik.php:131 +msgid "WPMU-Piwik" +msgstr "WPMU-Piwik" + +#: wp-piwik.php:142 +#: wp-piwik.php:557 +msgid "yesterday" +msgstr "χθες" + +#: wp-piwik.php:143 +#: wp-piwik.php:558 +msgid "today" +msgstr "σήμερα" + +#: wp-piwik.php:144 +#: wp-piwik.php:559 +msgid "last 30 days" +msgstr "τελευταίες 30 ημέρες" + +#: wp-piwik.php:179 +msgid "Settings" +msgstr "Ρυθμίσεις" + +#: wp-piwik.php:381 +msgid "Change" +msgstr "Αλλαγή" + +#: wp-piwik.php:382 +msgid "Currently shown stats:" +msgstr "Τρέχουσα προβολή στατιστικών:" + +#: wp-piwik.php:383 +msgid "Current shown stats: Overall" +msgstr "Τρέχουσα προβολή στατιστικών: Συνολικά" + +#: wp-piwik.php:448 +msgid "WP-Piwik Settings" +msgstr "WP-Piwik Ρυθμίσεις" + +#: wp-piwik.php:455 +#: wp-piwik.php:617 +msgid "Account settings" +msgstr "Ρυθμίσεις Λογαριασμού" + +#: wp-piwik.php:457 +#: wp-piwik.php:619 +msgid "Piwik URL" +msgstr "Piwik URL" + +#: wp-piwik.php:461 +#: wp-piwik.php:623 +msgid "Auth token" +msgstr "Σύμβολο γνησιότητας" + +#: wp-piwik.php:467 +#: wp-piwik.php:628 +msgid "To enable Piwik statistics, please enter your Piwik base URL (like http://mydomain.com/piwik) and your personal authentification token. You can get the token on the API page inside your Piwik interface. It looks like "1234a5cd6789e0a12345b678cd9012ef"." +msgstr "Για να ενεργοποιήσετε τα Piwik στατιστικά, παρακαλώ εισάγετε τη βασική Piwik URL σας (π.χ. http://mydomain.com/piwik) και τo προσωπικό σύμβολο (token) γνησιότητας. Μπορείτε να το βρείτε στη σελίδα API μέσα στη διεπαφή του Piwik. Μοιάζει με: "1234a5cd6789e0a12345b678cd9012ef"." + +#: wp-piwik.php:477 +msgid "Important note: If you do not host this blog on your own, your site admin is able to get your auth token from the database. So he is able to access your statistics. You should never use an auth token with more than simple view access!" +msgstr "Σημαντική Σημείωση: Εάν δεν φιλοξενείται το ιστολόγιο από εσάς, τότε ο διαχειριστής θα μπορεί να έχει πρόσβαση στο σύμβολο γνησιότητας (auth token) σας από τη βάση δεδομένων. Έτσι θα έχει πρόσβαση στα στατιστικά σας. Γι'αυτό το λόγο το σύμβολο γνησιότητας (auth token) δεν θα πρέπει να έχει περισσότερα δικαιώματα, παρά μόνο δικαίωμα προβολής." + +#: wp-piwik.php:485 +#: wp-piwik.php:489 +msgid "An error occured" +msgstr "Παρουσιάστηκε σφάλμα" + +#: wp-piwik.php:486 +msgid "Please check URL and auth token. You need at least view access to one site." +msgstr "Παρακαλώ ελέγξτε URL και σύμβολο γνησιότητας (auth token). Απαιτείται τουλάχιστον να έχετε δικαίωμα προβολής ενός site ." + +#: wp-piwik.php:492 +msgid "Choose site" +msgstr "Επιλέξτε site" + +#: wp-piwik.php:511 +#: wp-piwik.php:547 +#: wp-piwik.php:584 +#: wp-piwik.php:658 +msgid "Save settings" +msgstr "Αποθήκευση ρυθμίσεων" + +#: wp-piwik.php:515 +#: wp-piwik.php:643 +msgid "Tracking settings" +msgstr "Ρυθμίσεις παρακολούθησης" + +#: wp-piwik.php:521 +msgid "Add script" +msgstr "Προσθήκη script" + +#: wp-piwik.php:525 +msgid "If your template uses wp_footer(), WP-Piwik can automatically add the Piwik javascript code to your blog." +msgstr "Αν το πρότυπό σας χρησιμοποιεί wp_footer (), το WP-Piwik μπορεί αυτόματα να προσθέσει τον Piwik javascript κώδικα στο ιστολόγιο σας." + +#: wp-piwik.php:528 +msgid "Track 404" +msgstr "Παρακολούθηση 404" + +#: wp-piwik.php:532 +msgid "If you add the Piwik javascript code by wp_footer(), WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "Αν προσθέσατε το Piwik javascript κώδικα μέσω wp_footer (), το WP-Piwik μπορεί αυτόματα να προσθέσει μια κατηγορία 404 για την παρακολούθηση 404 επισκέψεων." + +#: wp-piwik.php:536 +#: wp-piwik.php:644 +msgid "Tracking filter" +msgstr "Φίλτρο Παρακολούθησης" + +msgid "Choose users by user role you do not want to track." +msgstr "Επιλέξτε το ρόλο χρήστη, τον οποίο δε θέλετε να παρακολουθήσετε." + +msgid "Choose users by user role you do not want to track. Requires enabled "Add script"-functionality." +msgstr "Επιλέξτε τους ρόλους χρηστών, τους οποίους δε θέλετε να παρακολουθήσετε. Γι'αυτό θα πρέπει να είναι ενεργοποιημένη η λειτουργία "Προσθήκη script"." + +#: wp-piwik.php:551 +msgid "Statistic view settings" +msgstr "Ρυθμίσεις Στατιστικών" + +#: wp-piwik.php:554 +msgid "Dashboard" +msgstr "Dashboard" + +#: wp-piwik.php:556 +msgid "No" +msgstr "Όχι" + +#: wp-piwik.php:557 +#: wp-piwik.php:558 +#: wp-piwik.php:559 +msgid "Yes" +msgstr "Ναι" + +#: wp-piwik.php:562 +msgid "Display a dashboard widget to your WordPress dashboard." +msgstr "Εμφάνιση ενός widget στο WordPress dashboard." + +#: wp-piwik.php:567 +msgid "Display a shortcut to Piwik itself." +msgstr "Εμφάνιση μιας συντόμευσης προς Piwik." + +#: wp-piwik.php:568 +msgid "Display to" +msgstr "Εμφάνιση για " + +#: wp-piwik.php:579 +msgid "Choose user roles allowed to see the statistics page." +msgstr "Επιλέξτε τους ρόλους χρηστών, οι οποίοι επιτρέπεται να βλέπουν τα στατιστικά." + +#: wp-piwik.php:612 +msgid "WPMU-Piwik Settings" +msgstr "WPMU-Piwik Ρυθμίσεις" + +#: wp-piwik.php:636 +msgid "Important note: You have to choose a token which provides administration access. WPMU-Piwik will create new Piwik sites for each blog if it is shown the first time and it is not added yet. All users can access their own statistics only, while site admins can access all statistics. To avoid conflicts, you should use a clean Piwik installation without other sites added. The provided themes should use wp_footer, because it adds the Piwik javascript code to each page." +msgstr "Σημαντική Σημείωση: Θα πρέπει να επιλέξετε ένα σύμβολο γνησιότητας (auth token), το οποίο θα έχει διαχειριστική πρόσβαση. Το WPMU-Piwik θα δημιουργήσει νέα Piwik sites για κάθε ιστολόγιο, εάν προβληθεί για πρώτη φορά και δεν έχει προστεθεί ακόμη. Όλοι οι χρήστες μπορούν να έχουν πρόσβαση στα δικά τους στατιστικά, ενώ οι διαχειριστές της ιστοσελίδας μπορούν να έχουν πρόσβαση σε όλες τις στατιστικές. Για την αποφυγή συγκρούσεων, θα πρέπει να χρησιμοποιήσετε μια καθαρή εγκατάσταση Piwik, χωρίς να έχετε πρoσθέσει άλλα sites. Τα παρεχόμενα πρότυπα θα πρέπει να χρησιμοποιούν wp_footer, διότι προσθέτει τον Piwik javascript κώδικα σε κάθε σελίδα." + +#: wp-piwik.php:671 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "Αν σας αρέσει το WP-Piwik, μπορείτε να στηρίξετε την ανάπτυξή του με μια δωρεά:" + +#: wp-piwik.php:687 +msgid "My Amazon.de wishlist (German)" +msgstr "Η λίστα επιθυμιών μου στο Amazon.de (Γερμανικά)" + +#. Plugin URI of the plugin/theme +msgid "http://www.braekling.de/wp-piwik-wpmu-piwik-wordpress/" +msgstr "http://www.braekling.de/wp-piwik-wpmu-piwik-wordpress/" + +#. Description of the plugin/theme +msgid "Adds Piwik stats to your dashboard menu and Piwik code to your wordpress footer." +msgstr "Προσθέτει τα στατιστικά Piwik στο dashboard μενού και τον κώδικα Piwik στο wordpress footer." + +#. Author of the plugin/theme +msgid "André Bräkling" +msgstr "André Bräkling" + +#. Author URI of the plugin/theme +msgid "http://www.braekling.de" +msgstr "http://www.braekling.de" + +msgid "Credits" +msgstr "Συντελεστές" + +msgid "Thank you very much for your donation" +msgstr "Ευχαριστώ για τις δωρεές" + +msgid "and all people flattering this" +msgstr "και σε όλους τους χρήστες που μιλούν με κολακευτικά λόγια" + +msgid "Graphs powered by jqPlot, an open source project by Chris Leonello. Give it a try! (License: GPL 2.0 and MIT)" +msgstr "Τα γραφήματα δημιουργούνται με τη βοήθεια του jqPlot, ενός προγράμματος ανοιχτού κώδικα του Chris Leonello. Δοκίμασέ το! (Άδεια χρήσης: GPL 2.0 και MIT)" + +msgid "Thank you very much" +msgstr "Ευχαριστώ πολύ" + +msgid ", and" +msgstr " και" + +msgid "for your translation work" +msgstr "για τη μετάφραση" + +msgid "Thank you very much, all users who send me mails containing criticism, commendation, feature requests and bug reports! You help me to make WP-Piwik much better." +msgstr "Σας ευχαριστώ πολύ, όλους τους χρήστες που μου στείλατε μηνύματα που περιέχουν κριτική, επιδοκιμασία, αιτήματα για νέες λειτουργίες και αναφορές σφαλμάτων! Βοηθάτε να γίνει το WP-piwik πολύ καλύτερο." + +msgid "Thank you for using my plugin. It is the best commendation if my piece of code is really used!" +msgstr "Σας ευχαριστώ για τη χρήση του plugin μου. Είναι ο καλύτερος έπαινος, αν ο κώδικάς μου χρησιμοποιείται πραγματικά!" + +msgid "Changes saved" +msgstr "Αλλαγές αποθηκεύτηκαν" + +msgid "installed" +msgstr "εγκαταστάθηκε" + +msgid "Next you should connect to Piwik" +msgstr "Στη συνέχεια συνδεθείτε με Piwik" + +msgid "Please validate your configuration" +msgstr "Παρακαλώ επαληθεύστε τη διαμόρφωση" + +msgid "Default date" +msgstr "Προεπιλεγμένη ημερομηνία" + +msgid "Default date shown on statistics page." +msgstr "Προεπιλεγμένη ημερομηνία που αναγράφεται στη σελίδα των στατιστικών." + +msgid "Dashboard data" +msgstr "Δεδομένα Dashboard" + +msgid "Display an overview widget to your WordPress dashboard." +msgstr "Προβολή ενός widget προεπισκόπησης στο WordPress dashboard." + +msgid "Boad chart" +msgstr "Board γράφημα" + +msgid "Display a visitor graph widget to your WordPress dashboard." +msgstr "Προβολή ενός widget με γράφημα επισκεπτών στο WordPress dashboard." + +msgid "No data available." +msgstr "Δεν υπάρχουν διαθέσιμα στοιχεία." + diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-es_ES.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..8bf50ce1ebac8893ef9cc9e579794da44f05f400 GIT binary patch literal 7734 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, 2011 +# Andres Sanchez , 2015 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:44+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/piwik/wp-piwik/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "%s %s instalado." + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "A continuación, debe conectarse a Piwik" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "%s actualizado a %s." + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "Por favor valida tu configuración" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Ajustes" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "Importante" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Estadísticas de Piwik" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "Configurar WP-Piwik" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "Ocurrió un error" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "Asistencia" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "Recargar" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "Cambios guardados." + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "Gracias por usar WP-Piwik!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s se conectó satisfactoriamente a Piwik %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "Está usando WordPress %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Conectar a Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "Mostrar Estadísticas" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "Habilitar Seguimiento" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "Créditos" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "ó" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "Más información" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "Puede escoger entre tres métodos de conexión:" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Modo de Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Dirección de Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "Ingrese la URL de Piwik. Ésta es la misma URL que usa para acceder a su instancia de Piwik, e.g. http://www.example.com/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "Ruta a Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "Auth token" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "Ver %sWP-Piwik FAQ%s." + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "Auto-configuración" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "Selecciona esto para elegir automáticamente tu blog desde el listado de sitios de Piwik por la dirección. Si tu blog no está todavía añadido en Piwik, WP-Piwik añadirá un sitio nuevo." + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "Sitio determinado" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "Seleccionar sitio" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "Hoy" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "Ayer" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "Mes actual" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "Último mes" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "Semana actual" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "Última semana" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "Fecha por defecto mostrada en la página de estadísticas" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "Deshabilitado" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "Últimos 30 días" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "Selecciona los roles de usuario que pueden acceder a las estadísticas." + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "Mostar un enlace directo al propio Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "Utilizar js/index.php" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "Agregar código de seguimiento" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "Código de seguimiento" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "Seguimiento de errores 404" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "WP-Piwik puede añadir automáticamente una categoría-404 para hacer el seguimiento de los errores 404" + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "Filtro de seguimiento" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "Selecciona, por el rol de usuario, los usuarios sobre los cuales no quieres hacer seguimiento." + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "Nombre de usuario" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "Donar" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "Si te gusta WP-Piwik, puedes añadir a su desarrollo con una donación:" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "Mi lista en Amazon.de" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "Por favor no te olvides de votar la compatibilidad en " + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "Muchas gracias por vuestra donación" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "El equipo de Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "Muchas gracias" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "por vuestro trabajo de traducción" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "Muchísimas gracias a todos los usuarios que me habéis enviado emails con críticas, recomendaciones, sugerencias de mejoras y reportes de errores. Me ayudais a hacer WP-Piwik mucho mejor." + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "Gracias a tipor utilizar mi plugin. Es el mayor elogio que mi plugin sea realmente utilizado." + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "Título" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "URL" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "Estadísticas" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "Estaísticas mostradas actualmente:" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "Nombre" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "Valor" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "Error de Piwik" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Único" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Visitas" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "Acciones" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "No hay datos disponibles." + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "semana" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Navegador" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Porcentaje" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "Otros" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "Navegadores" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Visitantes" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "Países" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "País" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "Conversiones" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "Ingresos" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "Enlace directo" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "Etiqueta" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "Cantidad" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Palabras Clave" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Palabra Clave" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Rebotado" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Información General" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Visitantes Únicos" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Páginas vistas" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "Tiempo total empleado" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Número de rebotes" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "Tiempo/Visita" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Máximo de páginas vistas durante una visita" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "Páginas" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "Plugins" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "Plugin" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "Referencias" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "Resoluciones" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Resolución" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "Detalles del Sistema Operativo" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "Sistema Operativo" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "Sistemas Operativos" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Fecha" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "Páginas Vistas" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fa_IR.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fa_IR.mo new file mode 100644 index 0000000000000000000000000000000000000000..ccb73f254164670ee0abf16e91a30fcb66b0ed3f GIT binary patch literal 9852 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, 2015 +# André Bräkling , 2011 +# André Bräkling, 2015 +# WebNashr , 2015 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:41+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/piwik/wp-piwik/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr " نصب شده" + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "سپس باید به پیویک متصل شوید" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "%s. به روز رسانی به %s" + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "لطفاً صحت تنظیمات خود را بررسی کنید" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "تنظیمات" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "مهم" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "آمار" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "خطائی رخ داده است" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "پشتیبانی" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "کلک میزنی،‌ها؟" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "بارگذاری مجدد" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "تغییرات ذخیره شد." + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "بابت استفاده از WP-Piwik از شما ممنونیم!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s با موفقیت به Piwik %s متصل شد." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "شما از وردپرس %s استفاده می کنید." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "اتصال به پیویک" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "آمار" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "فعال کردن ردگیری" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "تنظیمات حرفه ای" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "دست‌اندرکاران" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "یا" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "اطلاعات بیشتر" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "شما می توانید بین سه روش اتصال را انتخاب کنید:" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "میزبانی خود (اچ تی تی پی API، به طور پیش فرض)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "میزبانی خود (API PHP)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "حالت پیویک" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "غیر فعال کردن پیویک( پلاگاین به پیویک وصل نمیشود)" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "آدرس پیویک" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "مسیر پیویک" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "مسیر فایل را وارد کنید به عنوان مثال e.g. /var/www/piwik" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "نشانه اعتبارسنجی" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "تنظیم خودکار" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "انتخاب سایت" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "تاریخ پیش‌گزیده پیویک" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "امروز" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "دیروز" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "ماه جاری" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "ماه گذشته" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "هفته جاری" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "هفته‌ی گذشته" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "داده‌های پیش‌گزیده نمایش داده شده در صفحه آمار" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "کند!" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "غیرفعال" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "30 روز گذشته" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "انتخاب کاربرانی که مجازند صفحه آمار ر اببینند." + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "نمایش یک میان‌بر به پیویک اصلی." + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "پابرگ" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "تیتر" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "ره‌گیری 404 (صفحه یافت نشد)" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "غیرفعال‌سازی کوکی ها" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "پالایه ره‌گیری" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "کاربرانی را که نمی‌خواهید رهگیری شوند با توجه به وظیفه انتخاب کنید." + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "نوشته" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "دریافت" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "غیرفعال‌سازی محدودیت زمان" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "تماس برقرار نشد" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "توصیه نشده" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "واژه خالی" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "غیرفعال(پیش فرض)" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "اهداء کردن" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "اگر افزونه پیویک برای وردپرس را دوست دارید، با کمک مالی از آن حمایت کنید:" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "لیست علاقه مندی های من در Amazon.de" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "از شما به خاطر هدایایتان تشکر می‌کنم" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "تیم پیویک" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "از شما بسیار متشکریم" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "برای فعالیت شما در ترجمه" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "از شما بسیار متشکریم، تمام کاربرانی که به من ایمیل زدند، تشکر کردند، و درخواست ویژگی یا گزارش باگ انجام دادند. ش ما کمک کردید که پیویک وردپرس بسیار بهتر شود." + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "از شما به خاطر استفاده از این افزونه متشکریم. بهترین تقدیر این است که کدی که من نوشتم واقعاً استفاده شود." + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "اشکال زدایی" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "نیست" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "در دسترس" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "فعال" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "استفاده شده" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "ابزارها" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "اجرای اسکریپت" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "پاکسازی کش" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "کش پاک شد" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "سایت‌" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "سایت‌ها" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "سایت هنوز پیکربندی نشده" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "شناسه وبلاگ" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "عنوان" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "نشانی وب" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "شناسه سایت (پیویک)" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "وب سایت هنوزایجاد نشده است." + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "آمار" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "آمار در حال نمایش:" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "عملیات ناموفق" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "متغیر های سفارشی Piwik" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "نام" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "مقدار" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "خطای پیویک" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "یکتا" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "بازدیدها" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "تعداد بازدید ها" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "کارها" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "داده‌ای در دسترس نیست" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "هفته" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "جزئیات مرورگرها" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "مرورگر" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "درصد" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "غیره" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "مرورگر" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "بازدیدکنندگان" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "میان‌بر" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "کلیدواژه‌ها" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "جستجو در سایت" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "کلیدواژه" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "تعداد" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "بازگشت" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "نمای کلی" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "بازدیدکنندگان یکتا" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "نمایش‌های صفحه" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "کل زمان سپری شده" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "تعداد بازگشت" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "زمان/بازدید" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "حداکثر تعداد نمایش‌های صفحه در یک بازدید" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "برگه‌ها " + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "افزونه‌ها" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "افزونه" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "حداقل زمان ایجاد " + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "حداکثر زمان ایجاد ." + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "ارجاع‌دهنده‌ها" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "وضوح تصویر" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "وضوح تصویر" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "جزئیات سیستم عامل" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "سیستم عامل" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "سیستم عامل‌ها" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "تاریخ" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "تعداد نمایش صفحه" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fr_FR.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..044b0fae5dabca43437772e0e2bc5883fe89c65d GIT binary patch literal 28250 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, 2009 +# André Bräkling, 2015 +# Franck, 2015-2016 +# Vincent Biret , 2015 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:41+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: French (France) (http://www.transifex.com/piwik/wp-piwik/language/fr_FR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "%s %s installé." + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "Ensuite, vous devez vous connecter à Piwik" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "%s mis à jour vers %s." + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "Merci de valider votre configuration" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Paramètres" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "Important" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Statistiques Piwik" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "Paramétrer WP-Piwik" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "Une erreur s'est produite" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "Support" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "Alors, on triche ?" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "Recharger" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "Modifications enregistrées." + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "Merci d'utiliser WP-Piwik !" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s est connecté avec succès à Piwik %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "Vous utilisez WordPress %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "Vous utilisez le réseau de blogs (WPMU) d'un WordPress %s . WP-Piwik va gérer vos sites comme des sites distincts." + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "WP-Piwik %s n'a pas pu se connecter à Piwik à partir de votre configuration. Vérifiez la section ci-dessous »Connecter à Piwik«." + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "WP-Piwik %s n'a pas pu se connecter à Piwik à partir de votre configuration. L'erreur suivante est apparue au cours de la connexion :
%s" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "WP-Piwik %s doit en premier être connecté à Piwik. Vérifiez la section ci-dessous » Connecter à Piwik « à Piwik«." + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Connecter à Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "Afficher les statistiques" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "Activer le suivi" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "Réglages expert" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "Crédits" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "WP-Piwik est une extension WordPress pour afficher une sélection de stats Piwik dans votre tableau de bord d'admin WordPress et pour ajouter et configurer votre code de suivi Piwik. Pour utiliser cela, vous aurez besoin de votre propre instance Piwik. Si vous ne possédez pas encore de configuration Piwik, vous avez deux options simples : utilisez au choix" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "ou" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "Plus d'informations" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "Vous pouvez choisir entre trois méthodes de connexion :" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "Auto-hébergé (API HTTP par défaut)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "C'est l'option par défaut pour un Piwik auto-hébergé et devrait fonctionner pour la plupart des configurations. WP-Piwik va se connecter à Piwik en utilisant http(s)." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "Auto-hébergé (API PHP)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "Choisissez cela, si votre Piwik auto-hébergé et WordPress fonctionnent sur la même machine et que vous connaissez le chemin complet du serveur de votre instance Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Mode Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "Désactivé (WP-Piwik ne se connectera pas à Piwik)" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Piwik URL" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "Entrez votre URL Piwik. C'est la même URL que vous utilisez pour accéder à votre instance de Piwik, par exemple, http://www.example.com/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "Chemin Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "Entrez le chemin de votre instance Piwik, par exemple /var/www/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "Clef partagée (token_auth)" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "Entrez votre clef partagée (token_auth) Piwik ici. C'est un code alphanumérique du genre 0a1b2c34d56e78901fa2bc3d45678efa." + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "Voir la %sFAQ WP-Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "Auto config" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "Cochez cette case pour choisir automatiquement votre blog à partir de vos sites Piwik par URL. Si votre blog est pas encore ajouté à Piwik, WP-Piwik ajoutera un nouveau site." + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "Site déterminé" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "Sélectionner le site" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "Date par défaut Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "Aujourd'hui" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "Hier" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "Mois en cours" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "Mois précédent" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "Semaine en cours" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "Semaine précédente" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "Date affichée par défaut sur la page de statistiques." + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "Afficher les données SEO" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "Afficher les données de classement SEO sur la page de statistiques." + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "Doucement !" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "Tableau de bord vue d'ensemble" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "Désactivé" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "30 derniers jours" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "Activer le widget du tableau de bord WP-Piwik "Vue d'ensemble"." + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "Tableau de bord graphique" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "Activer le widget du tableau de bord WP-Piwik "Graphique"." + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "Tableau de bord SEO" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "Activer le widget du tableau de bord WP-Piwik "SEO"." + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "Afficher le graphique dans la barre d'outils WordPress" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "Afficher un graphique des visiteurs des 30 derniers jours dans la barre d'outils WordPress" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "Afficher les stats pour le(s)" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "Choisissez les rôles utilisateurs autorisés à voir la page de statistiques." + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "Afficher les stats par article" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "Afficher les stats de l'article sur la page admin de modification des articles." + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "Raccourci Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "Affiche un raccourci vers Piwik lui-même." + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "Nom d'affichage WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "Nom d'extension affichée dans WordPress." + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "Activer les codes courts" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "Active les codes courts dans le contenu des articles ou des pages" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "Vous pouvez choisir entre quatre modes de code de suivi :" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "WP-Piwik n'ajoutera pas le code de suivi. Utilisez cela si vous souhaitez ajouter le code de suivi dans les fichiers de votre thème, ou que vous utilisez une autre extension pour ajouter le code de suivi." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "Suivi par défaut" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "WP-Piwik utilisera le code de suivi standard de Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "Utiliser js/index.php" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "Vous pouvez choisir ce code de suivi, pour délivrer un code proxy minifié et d'éviter d'utiliser les fichiers appelés piwik.js ou piwik.php." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "Voir le %sfichier lisez-moi%s" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "Utiliser une code proxy" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "Utilisez ce code de suivi pour ne pas révéler l'URL du serveur Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "Voir la %sFAQ Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "Entrer manuellement" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "Entrer manuellement votre propre code de suivi. Vous pouvez choisir l'une des options préalables, pré-configurer votre code de suivi et le modifier manuellement à la fin." + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "Utilisez l'espace réservé {ID} pour ajouter l'identifiant de site Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "Ajouter le code de suivi" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "Code de suivi" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "Emplacement du code JavaScript" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "Pied de page" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "En-tête" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "Choisissez si le code JavaScript est ajouté dans le pied de page ou l'en-tête." + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "Code noscript" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "Ajouter <noscript>" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "Ajoute le code <noscript> à votre pied de page." + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "Désactivé en mode proxy." + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "Ajouter le paramètre rec au code noscript" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "Activer le suivi des visiteurs sans JavaScript (non recommandé)." + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "Activer le suivi de contenu" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "Suivre tous les blocs de contenu" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "Suivre uniquement les blocs de contenu visibles" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "Le suivi de contenu vous autorise à suivre l'interaction avec le contenu d'une page web ou d'une application." + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "Voir la %sdocumentation Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "Suivre la recherche" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "Utiliser la fonctionnalité avancée Piwik d'analyse de recherche du site" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "Suivre les 404" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "WP-Piwik peut ajouter automatiquement une catégorie 404 pour suivre les visites de page 404." + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "Afficher la boîte de variables personnalisées" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "Afficher une boîte de modification des "variables personnalisées" sur la page de modification des articles;" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "Ajouter de nouveaux types de fichier pour le suivi de téléchargement" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "Ajouter des extensions de fichier pour le suivi de téléchargement, séparées par une barre verticale (|)." + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "Désactiver les cookies" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "Désactiver tous les cookies de suivi pour un visiteur" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "Limiter la durée de vie des cookies" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "Vous pouvez limiter la durée de vie des cookies pour éviter le suivi de vos utilisateurs sur une période plus longue que nécessaire." + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "Expiration du délai d'attente visiteur (en secondes)" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "Expiration du délai d'attente session (en secondes)" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "Expiration du délai d'attente référant" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "Suivre les pages d'admin" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "Activer le suivi des utilisateurs sur les pages d'admin (n'oubliez pas de configurer le filtre de suivi adéquat)" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "Filtre de suivi" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "Choisissez, pour chaque rôle, ceux que vous ne souhaitez pas inclure dans le suivi." + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "Suivre les sous-domaines dans le même site web" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "Ajoute *.-préfixe au cookie de domaine." + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "Ne pas comptabiliser les sous-domaines en tant que lien sortant" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "Ajoute *.-préfixe au domaine suivi." + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "Suivre les flux RSS" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "Activer le suivi des articles dans les flux via un pixel de suivi." + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "Suivre les liens du flux RSS comme une campagne" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "Ceci ajoutera des paramètres de campagne Piwik aux liens du flux RSS." + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "Campagne flux RSS" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "Mot-clef : nom d'article." + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "Activer une minuterie par pulsation" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "Activer une minuterie par pulsation pour obtenir des durées de visite plus précises en envoyant des requêtes ping HTTP périodiques tant que le site est ouvert. Entrez le temps entre les pings en secondes (par défaut dans Piwik : 15) pour l'activer ou 0 pour désactiver cette fonctionnalité. Remarque : Cela causera beaucoup de requêtes HTTP supplémentaires sur votre site." + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "Identifiant de suivi utilisateur" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "Identifiant d'utilisateur WP" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "Courriel" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "Nom à afficher publiquement (Non Recommendé !)" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "Lorsqu'un utilisateur est connecté à WordPress, suivre son "Identifiant". Vous pouvez sélectionner quel champ du profil utilisateur à suivre comme "Identifiant". Lorsque c'est activé, le suivi est basé sur le courriel est recommandé." + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "Habituellement, vous n'avez pas besoin de pas modifier ces réglages. Si vous voulez faire, vous devez savoir ce que vous faites ou avoir obtenu le conseil d'un expert." + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "Activer le cache" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "Appels API de cache, qui ne contiennent pas les valeurs d'aujourd'hui, pour une semaine." + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "Connexion HTTP via" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "cURL" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "fopen" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "Méthode HTTP" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "POST" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "GET" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "Désactiver la limite de temps" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "Utilisez set_time_limit(0) si la pages de statistiques provoque une expiration du délai d'attente." + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "Expiration du délai d'attente de la connexion" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "Désactiver la vérification par les pairs SSL" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "non recommandé" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "Désactiver la vérification SSL par l'hôte" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "Agent utilisateur (User agent)" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "Utiliser l'agent utilisateur (user-agent) par défaut de PHP" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "vide" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "Définir un agent utilisateur (user-agent) spécifique" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "Agent utilisateur (user-agent) spécifique" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "Ajouter data-cfasync=false" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "Voir la %sBase de connaissances CloudFlare%s." + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "Ajoute data-cfasync=false à la balise du script, pour demander par exemple, au chargeur Rocket d'ignorer le script. " + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "URL CDN" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "URL CDN (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "Forcer Piwik à utiliser un protocole spécifique" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "Désactivé (par défaut)" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "http" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "https (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "Choisissez si vous voulez forcer explicitement Piwik à utiliser le protocole HTTP ou HTTPS. Ne fonctionne pas avec une URL CDN." + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "Avis de mise à jour" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "Toujours afficher si WP-Piwik est mis à jour" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "Afficher uniquement si WP-Piwik est mis à jour et que les paramètres ont change." + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "Choisissez si vous souhaitez obtenir un avis de mise à jour si WP-Piwik est mis à jour." + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "Définir tous les types de fichier pour le suivi de téléchargement" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "Remplacer les extensions de fichier par défaut de Piwik pour le suivi de téléchargement, séparées par une barre verticale (|). Laisser vide pour conserver les réglages par défaut de Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "Faire un don" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "Si vous aimez WP-Piwik, vous pouvez soutenir son développement par un don :" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "Ma liste de souhaits Amazon.de" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "Merci de ne pas oublier de voter la compatibilité avec" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "Merci beaucoup pour votre don" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "l'équipe Piwik elle-même" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr ", et toutes les personnes flatteuses à ce sujet." + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "Merci beaucoup" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "pour votre travail de traduction" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "Merci beaucoup, à tous les utilisateurs qui envoient des mails contenant critique, éloge, demandes de fonctionnalités et rapports de bogues ! Vous m'avez aidé a rendre WP-Piwik encore meilleur." + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "Je vous remercie d'utiliser mon extension. C'est la meilleur éloge si mon morceau de code est vraiment utilisé !" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "Le meilleur endroit pour obtenir de l'aide :" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "Forum de support WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "Débogage" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "allow_url_fopen doit être activé ou cURL doit être disponible :" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "cURL est" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "non" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "disponible" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "allow_url_fopen est" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "activé" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "est utilisé." + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "L'URL Piwik de base identifée est" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "Outils" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "Lancer le script de test" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "Navigateur de site" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "Nettoyer le cache" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "Êtes-vous sûr de vouloir effacer tous les réglages ?" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "Réinitialiser WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "Les derniers messages de support sur WordPress.org" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "Les réglages ont été effacés (sauf les paramètres de connexion)" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "Le cache a été effacé." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "site" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "sites" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "Pas de site configuré actuellement." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "Identifiant du blog" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "Titre" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "URL" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "Identifiant du site (Piwik)" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "Le site n'a pas encore été créé." + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "Statistiques" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "Stats affichées actuellement : " + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "Impossible de résoudre" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "realpath() retourne faux (false)" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "La classe Piwik\\FrontController n'existe pas." + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "La class Piwik\\API\\Request n'existe pas." + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "Variables personnalisées Piwik" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "Nom" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "Valeur" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "Définir des variables personnalisées pour une page vue" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "Erreur Piwik" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Unique" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Visites" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "Entrées" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "Actions" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "Pas de données disponibles" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "aujourd'hui" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "mois en cours" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "mois précédent" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "semaine en cours" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "semaine précédente" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "hier" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "semaine" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "30 derniers jours" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "Détails navigateur" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Navigateur" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Pourcentage" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "Autres" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "Navigateurs" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Visiteurs" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "Le graphique contient les valeurs indiquées dans le tableau ci-dessous (visiteurs / unique / rebonds). La ligne rouge montre une courbe de tendance linéaire (unique)." + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "Pays" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "Pays" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "Raccourci" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Mots Clés" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "Recherche du site" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Mots clés" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "Requêtes" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Rebonds" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Vue d'ensemble" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "Tableau de bord" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Visiteurs uniques" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Pages vues" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "Temps passé total" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Nombre de sauts" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "Temps / visite" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Pages vues max.par visite" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "Pages" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "Page" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "Extensions" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "Extension" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "Temps min. de génération" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "Temps max. de génération" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "Référants" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "Résolutions" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Résolution" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "Détails du système d'exploitation" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "Système d'exploitation" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "Systèmes d'exploitation" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Date" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "Pages vues" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "WP-Piwik requiert au moins PHP 5.3. Vous utilisez la version obsolète %s. Merci de mettre à jour PHP pour utiliser WP-Piwik." diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hi.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hi.mo new file mode 100644 index 0000000000000000000000000000000000000000..0583aeb8d6ed0f670e816d50dd742cebea756f98 GIT binary patch literal 7471 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 Gu=yVkU>ef^ literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hi.po b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hi.po new file mode 100644 index 00000000..2d5681ec --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hi.po @@ -0,0 +1,1529 @@ +# +# Translators: +# AnandVivek, 2015 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:43+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Hindi (http://www.transifex.com/piwik/wp-piwik/language/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "%s %s स्थापित।" + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "" + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "महत्वपूर्ण" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Piwik आँकड़ा" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "सहयोग" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "धोका’ उह?" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "पुन: लोड" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "बदलाव सहेजा गया।" + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "WP-Piwik का उपयोग करने हेतु धन्यवाद!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s सफलतापूर्वक Piwik %s से जुड़ गया है।" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "आप वर्डप्रैस %s चला रहे हैं।" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "आप अभी वर्डप्रैस %s ब्लॉग (डबल्यूपीएमयू) चला रहे हैं। WP-Piwik आपके साइट को एक अलग वैबसाइट की तरह चलाएगा।" + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Piwik से जोड़ें" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "आँकड़ा दिखाएँ" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "ट्रैकिंग सक्षम" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "विशेषज्ञ सेटिंग्स" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "श्रेय" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "WP-Piwik वर्डप्रैस का एक प्लगइन है जो Piwik के आँकड़ों को वर्डप्रैस के प्रबंधक डैशबोर्ड में दिखाता है। इसके उपयोग के लिए आपको अपना Piwik की आवश्यकता होगी। यदि आपके पास Piwik का सेटअप नहीं है तो आप इसे दो साधारण तरीके से प्राप्त कर सकते हैं।" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "या" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "और जानकारी" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "आप इनमें से तीन जोड़ने की विधि चुन सकते हैं:" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Piwik मोड" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Piwik यूआरएल" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "साइट चुनें" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "Piwik मूल दिनांक" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "आज" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "कल" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "इस माह" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "पिछले माह" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "इस सप्ताह" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "पिछले सप्ताह" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "SEO आँकड़ा दिखाएँ" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "SEO पायदान डाटा को आँकड़ा पृष्ठ पर दिखाएँ।" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "धीमा!" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "डैशबोर्ड अवलोकन" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "अक्षम" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "अंतिम 30 दिवस" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "डैशबोर्ड SEO" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "WP-Piwik दृश्य नाम" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "प्लगइन नाम जो वर्डप्रैस में दिखता है।" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "js/index.php का उपयोग" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "प्रॉक्सि स्क्रिप्ट का उपयोग" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "अपने से डालें" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "ट्रैक 404" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "कुकी अक्षम करें" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "उपयोगकर्ता नाम" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "cURL" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "fopen" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "POST" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "GET" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "रिक्त" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "CDN URL" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "CDN URL (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "http" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "https (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "सूचना अद्यतन" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "दान" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "आपके दान के लिए धन्यवाद" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "बहुत बहुत धन्यवाद" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "आपके अनुवाद कार्य हेतु" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "सबसे अच्छा जगह सहायता के लिए:" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "WP-Piwik सहायता मंच" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "allow_url_fopen है" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "औज़ार" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "यूआरएल" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "साइट आईडी (Piwik)" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "आँकड़ा" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "नाम" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "मूल्य" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "Piwik त्रुटि" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "डाटा अनुपलब्ध" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "सप्ताह" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "ब्राउज़र जानकारी" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "ब्राउज़र" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "प्रतिशत" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "अन्य" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "देश" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "देश" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "रूपांतरण" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "राजस्व" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "लेबल" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "मात्रा" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "अवलोकन" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "नए दृश्यक" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "संचालन प्रणाली की जानकारी" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "संचालन प्रणाली" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "संचालन प्रणालियाँ" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "दिनांक" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hu_HU.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-hu_HU.mo new file mode 100644 index 0000000000000000000000000000000000000000..ff29d1ce1101c302a8bdb9a2cfc5bfd0329369d0 GIT binary patch literal 27582 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, 2015-2016 +# Márk Kökény , 2016 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:41+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.com/piwik/wp-piwik/language/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "%s %s telepítve." + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "Most kapcsolódnod kell a Piwik-hez" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "%s frissítve erre: %s." + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "Kérlek ellenőrizd a konfigurációd" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Beállítások" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "Fontos" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Piwik statisztikák" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "WP-Piwik beállításai" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "Egy hiba adódott" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "Támogatás" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "Csalsz ’e, mi?" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "Újratöltés" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "Módosítások elmentve." + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "Köszönjük, hogy a WP-Piwik-et használod!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s sikeresen kapcsolódott a Piwik %s-hez." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "WordPress %s verzióját használod." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "WordPress %s bloghálózatot (WPMU) használsz. WP-Piwik külön oldalként kezeli minden oldalad." + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "WP-Piwik %s nem tud kapcsolatot létesíteni a Piwik-el a megadott kapcsolati adatok alapján. Ellenőrizd a »Kapcsolódás Piwikhez« szekciót lentebb." + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "WP-Piwik %s nem tud kapcsolatot létesíteni a Piwik-el a megadott kapcsolati adatok alapján. Kapcsolódás közben az alábbi hiba lépett fel:
%s" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "WP-Piwik-nek mindenekelőtt kapcsolatban kell lennie a Piwik-el. Ellenőrizd a »Kapcsolódás Piwikhez« szekciót lentebb." + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Kapcsolódás Piwik-hez" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "Statisztikák megjelenítése" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "Követés engedélyezése" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "Haladó beállítások" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "Stáblista" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "A WP-Piwik egy WordPress kiegészítő, amely a Piwik statisztikáit megjeleníti a te WordPress admin vezérlőpultodon, illetve Piwik követőkódot helyezhetsz el vele a blogodon. Használatához szükséged lesz egy saját működőképes Piwik rendszerre. Amennyiben nincs Piwik-ed, két egyszerű lehetőség közül választhatsz: választhatod bármelyiket" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "vagy" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "További információk" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "Válassz a három kapcsolódási metódus közül:" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "Általad-üzemeltetettt (HTTP API, alapértelmezett)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "Ez az alapértelmezett beállítás az általad-üzemeltetett Piwik-hez, ennek a legtöbb esetben működnie kell. WP-Piwik http(s)-en keresztül fog csatlakozni Piwik-edhez." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "Általad-üzemeltetett (PHP API)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "Válaszd ezt, ha az általad-üzemeltetett Piwik és a WordPress ugyanazon a szervergépen fut és tudod a teljes elérési útvonalat Piwik rendszeredhez." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Piwik üzemmód" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "Letiltva (WP-Piwik nem csatlakozik a Piwikhez)" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Piwik URL" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "Add meg Piwik-ed URL címét. Ugyan az a cím, amelyen te is eléred Piwik-ed webböngészőn keresztül. Pl.: http://www.example.com/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "Piwik útvonal" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "Add meg az elérési útvonalat a Piwik telepítésedhez, pl.: /var/www/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "Authorizációs token" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "Írd be Piwik authorizációs tokened ide. Ez egy alfanumerikus karaktersor, pl.: 0a1b2c34d56e78901fa2bc3d45678efa." + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "Bővebb infó %sWP-Piwik GYIK%s" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "Automata konfiguráció" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "Pipáld be ezt, hogy automatikusan kiválasszam a blogod a Piwik oldalaid közül URL alapján. Amennyiben még nem adtad hozzá az oldalad Piwik-hez, a WP-Piwik megteszi ezt helyetted." + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "Meghatározott oldal" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "Válassz oldalt" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "Piwik alapértelmezett dátum" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "Ma" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "Tegnap" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "Jelen hónap" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "Előző hónap" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "Jelen hét" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "Múlthét" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "Alapértelmezett dátum látható a statisztikák oldalon." + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "SEO adat mejelenítése" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "SEO rangsor adat megjelenítése a statisztikák oldalon." + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "Lassú!" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "Vezérlőpult összesítés" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "Letiltva" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "Utolsó 30 nap" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "WP-Piwik vezérlőpulti widget "Összegzés" engedélyezése." + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "Vezélőpult grafikon" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "WP-Piwik vezérlőpulti widget "Grafikon" engedélyezése." + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "Vezélőpult grafikon" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "WP-Piwik vezérlőpulti widget "SEO" engedélyezése." + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "Grafikon megjelenítése a WordPress eszköztáron" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "Utolsó 30 nap látogatói adatainak megjelenítése a WordPress eszköztáron." + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "Statisztikák megjelenítése ehhez:" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "Válaszd ki, melyik felhasználói csoport tagjai láthatják a statisztikák oldalt." + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "Megjelenítendő bejegyzés statisztikák száma" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "Az egyszeri bejegyzések statisztikáit jeleníti meg az admin oldalon." + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "Piwik parancsikon" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "Piwik prancsikon megejlenítése." + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "WP-Piwik megjelenítendő neve" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "Ez a név fog megjelenni a WordPressben." + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "Shortcode engedélyezése" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "Shortkódok engedélyezése a bejegyzésben, vagy az oldal tartalmában" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "Négy követési módszer közül választhatsz:" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "WP-Piwik nem állít be követőkódot. Használd ezt, ha manuálisan akarod beágyazni a követőkódod a sablonfájlokba, vagy másik kiegészítőt használsz erre a célra." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "Alapértelmezett követés" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "WP-Piwik a Piwik sztenderd követőkódját alkalmazza." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "Használja a js/index.php-t" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "Választhatod ezt a követőkódot, amely kicsinyített proxy kódot tartalmaz, ezzel elkerülve a piwik.js illetve piwik.php fájlok használatát." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "Továbbiak az %solvass el fájlban%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "Használjon proxy szkriptet" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "Használd ezt a követőkódot, és nem feded fel a Piwik szerver URL címét." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "Bővebb infó %sWP-Piwik GYIK%s" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "Megadás manuálisan" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "Írd be saját követőkódod manuálisan. Választhatsz egyet az előbbi opciók közül, elő-konfigurálod a követőkódot, majd a végén váltasz manuális szerkesztésre." + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "Használj placeholder-t {ID} hogy hozzáadd a Piwik oldal ID-t." + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "Követőkód hozzáadása" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "Követőkód" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "JavaScript kód pozíció" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "Lábléc" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "Fejléc" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "Válaszd ki, hogy a fejlécbe vagy a láblécbe kerüljön a JavaScript kód." + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "Noscript kód" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "<noscript> Hozzáadása" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "<noscript> kódot helyez a láblécbe." + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "Proxy mód letiltva." + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "Rec paraméter hozzárendelése a noscript kódhoz" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "JavaScript mentes látogatókövetés engedélyezése (nem ajánlott)." + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "Tartalom követés engedélyezése" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "Minden tartalmi blokk követése" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "Csak a látható tartalmi blokk követése" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "A tartalom követés engedélyezi számodra, hogy interakciókat kövess az oldal tartalmán belül, vagy egy applikációban." + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "Bővebb infó a %sPiwik dokumentációban%s." + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "Keresés követése" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "Piwik haladó oldal keresési analitika funkció használata." + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "404 követése" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "WP-Piwik képes automatikusan 404-kategóriát létrehozni, hogy nyomonkövesse a 404-oldal-látogatásokat." + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "Egyedi változók doboz megjelenítése" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "Megjeleníti az "egyedi változók" szerkesztése dobozt a bejegyzés szerkesztés oldalon." + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "Új fájltípusok hozzáadása a letöltés követéshez" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "Új fájltípusok hozzáadása a letöltés követéshez, függőleges vonallal elválasztva (|)." + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "Sütik letiltása" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "Minden követési süti letiltása egy látogatónak." + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "Süti élettartamának limitálása" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "Limitálhatod a sütik élettartamát, hogy elkerülhesd a felhasználók a szükségesnél hosszabb benntartását." + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "Látogatói időkorlát (másodpercben)" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "Munkamenet időkorlát (másodpercben)" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "Hivatkozás időkorlát (másodpercben)" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "Admin oldalak követése" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "Felhasználók követésének engedélyezése az admin oldalakon (ne felejts el megfelelő követési szűrőt alkalmazni)." + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "Követési szűrő" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "Válaszd ki azokat a felhasználói szinteket amelyeket nem akarsz követni." + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "Aldomainek követése ugyanazon weboldalon" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "Hozzáad egy *.-prefixumot a domain sütiébe." + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "Ne számolja az aldomaineket a kilépési linkeknél" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "Hozzáad egy *.-prefixumot a követett domainhez." + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "RSS csatornák követése" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "Bejegyzések követése a csatornában követő pixel segítségével." + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "RSS csatorna linkek kampánykénti követése" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "RSS csatorna kampány" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "Kulcsszó: hivatkozás neve." + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "Heartbeat időzítő engedélyezése" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "A heartbeat időzítő engedélyezésével pontosabb látogatási hosszakat kaphatsz, periodikusan kiküldött HTTP ping kérések kiküldésének segítségével, rögtön miután az oldalt megnyitották. Add meg az időt a pingek között másodpercben(Piwik alapértelmezett: 15), hogy engedélyezd, vagy 0-t hogy letiltsd ezt a funkciót. Megjegyzés: Ez a funkció sok HTTP kérést okozhat az oldaladon." + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "Felhasználó ID követés" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "WP felhasználó ID" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "E-mailcím" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "Felhasználóinév" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "Megjelenítési név (Nem ajánlott!)" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "Mikor egy felhasználó bejelentkezik a WordPress-be, követi az ő "User ID-át". Ki tudod választani, melyik mezőt tekintse a rendszer "User ID-nak". Mikor engedélyezve van, ajánlott az email címet kiválasztani." + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "Általában nincs szükség ezen beállítások módosítására. Azonban ha akarod akkor megteheted, feltéve ha tudod, hogy mit csinálsz, vagy kaptál tanácsot hozzáértő személytől." + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "Gyorsítótár engedélyezése" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "API hívások gyorsítótárazása egy hétig, amelyek nem tartalmazzák a mai napi értékeket." + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "HTTP kapcsolódás ezzel" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "cURL" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "fopen" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "HTTP metódus" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "POST" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "GET" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "Időlimit letiltása" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "set_time_limit(0) használata, ha a statisztikák oldal betöltésekor időtúllépés lép fel." + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "Kapcsolódási időkorlát" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "SSL peer ellenőrzés letiltása" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "nem ajánlott" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "SSL hoszt ellenőrzésének letiltása" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "User agent" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "Használja a PHP alapértlmezett user agent-jét" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "üres" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "Specifikus user agent meghatározása" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "Specifikus user agent" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "data-cfasync=false hozzáadása" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "CDN URL" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "CDN URL (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "Erőltesse a Piwik-et, hogy használja a specifikus protokollt" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "Letiltva (alapértelmezett)" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "http" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "https (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "Válaszd ezt, ha explicit módon akarod rábírni a Piwik-et, hogy használjon HTTP-t vagy HTTPS-t. Nem fog működni CDN URL-el." + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "Frissítési értesítés" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "Mutassa mindíg, ha a WP-Piwik frissítve van" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "Mutassa csak akkor, ha a WP-Piwik frissítésre került és beállításai módosultak" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "Válaszd ezt, ha értesítést kívánsz kapni a WP-Piwik frissítéséről." + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "Add meg a követni kívánt fájltípusokat" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "Piwik alapértelmezett fájlkiterjesztések lecserélése letöltés követéskor, függőleges vonallal elválasztva (|). Hagyd üresen, hogy megtartsd a Piwik alapértelmezett beállításait." + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "Támogatás" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "Ha tetszik a WP-Piwik, támogasd fejlesztésünket egy kis adománnyal:" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "Amazon.de kívánságlistám" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "Kérlek ne felejts el szavazni a kompatibilitásról a" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "Köszönjük, hogy támogattad munkánkat" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "a Piwik csapat maga" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "és minden személy aki megtisztelte ezt" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "Köszönettel tartozunk" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "a fordítási munkádért" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "Köszönettel tartozunk minden felhasználónak, aki kritikájával, dícséretével, új funkciók ajánlásával és hibabejelentésekkel segítette munkánkat! Általatok lesz a WP-Piwik kiegészítő jobb és jobb." + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "Köszönjük neked, hogy használod ezt a kiegészítőt. A legnagyobb dícséret az, hogy hasznos számotokra az amit csinálunk." + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "Legjobb hely, ahol segítséget kaphatsz:" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "WP-Piwik támogatási fórum" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "Hibakeresés" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "Az allow_url_fopen-nek kell engedélyezve vagy a cURL-nek elérhetőnek kell lennie:" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "cURL" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "nem" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "elérhető" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "allow_url_fopen" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "engedélyezve" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "használatban." + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "A meghatározott Piwik gyökér URL:" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "Eszközök" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "Tesztszktipt futtatása" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "Oldalböngésző" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "Gyorsítótár ürítése" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "Biztos, hogy törölnél minden beállítást?" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "WP-Piwik visszaállítása" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "Legfrissebb támogatási fórumok a WordPress.org-on" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "Beállítások törölve (kivéve a csatlakozási beállításokat)" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "Gyorsítótár kiürítve" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "oldal" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "oldalak" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "Nincs konfigurált oldal." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "Blog ID" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "Cím" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "URL" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "Oldal ID (Piwik)" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "Oldal még nem készült el." + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "Statisztikák" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "Jelenleg mutatott statok:" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "Nem sikerül feloldani" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "realpath() false értékkel tér vissza" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "Piwik\\FrontController osztály nem létezik." + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "Piwik\\API\\Request osztály nem létezk." + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "Piwik egyedi változók" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "Név" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "Érték" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "Egyedi változók beállítása az oldalnézethez" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "Piwik hiba" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Egyedi" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Látogatások" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "Kattintások" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "Akciók" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "Nincs elérhető adat." + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "ma" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "jelen hónap" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "előző hónap" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "jelen hét" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "előző hét" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "tegnap" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "hét" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "utolsó 30 nap" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "Böngésző adatai" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Böngésző" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Százalék" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "Egyebek" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "Böngészők" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Látogatók" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "A grafikon tartalmazza az értékeket, melyek láthatóak a lentebbi táblázatban (látogatók / egyedi / visszapattanások). A vörös vonal mutatja a lineáris trendvonalat (egyedi)." + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "Országok" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "Ország" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "Parancsikon" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Kulcsszavak" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "Oldal keresés" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Kulcsszó" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "Kérések" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Visszapattant" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Áttekintés" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Egyedi látogatók" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Oldal megtekintések" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "Eltöltött idő" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Visszapattanások száma" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "Idő/látogatás" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Max. oldal megtekintések egy látogatás alatt" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "Oldalak" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "Oldal" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "Kiegészítők" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "Kiegészítő" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "Min. oldalgenerációs idő" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "Max. oldalgenerációs idő" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "Hivatkozások" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "Felbontások" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Felbontás" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "Operációs rendszer adatok" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "Operációs rendszer" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "Operációs rendszerek" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Dátum" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "Oldal megtekintések" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "A WP-Piwik megkívánja legalább a PHP 5.3-at. Te egy korábbi %s verziót használsz. Kérlek frissítsd a PHP-t, hogy használni tudd a WP-Piwik-et." diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-id.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-id.mo new file mode 100644 index 0000000000000000000000000000000000000000..9ac9bde3202ad7b1e3e4f7930f6b0412b78c3417 GIT binary patch literal 880 zcmZ9J%}x|S5XW1@uR&wvU}EB-6E70d%nZZ;v)O|pC@vqPS>)uQcBfd{neCbM^swyJ z_yi`rfft{H_wWgP2>;Cvl2}RQSKU?9|Ej6qi}M!(_6YtQ{vG}V{s-!u{OW<~4m^ zVyiS~Y-?Sb8gXNs)qEXIMUSVG(q>|h23&}gMl3!yWSn+W@rlpaG%Whs6)cWwwuZ(m zOzEWMVL2YN$v6|G6{#)1^3bW>OnshdCGt2`sh;RONDupJ%Q88%px%<>M6O2hx{4ze zZ6Zw8)|aEzC_>-I#(rOIGIdVoPR=}@c9ac2`k@hIH}YuDB34NorO!m z{_g(v&1msT6yUcyHt1toVIarnF02aDrXz=^WNUWaqyCQCxT*7ECv4TW8I~EEOytHu zyML`FQfEP0G?ogrQ`&KzNK;)M>u%hUv#=X=0?}(1Dh_x=mafqwM|oq0y4~e_Drihb q^k(a%TBO()RVXv!Lz6XyI6wh*CY;VFmzlPlmwu^K>l{U>Y{Xv)qtB)Q literal 0 HcmV?d00001 diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-id.po b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-id.po new file mode 100644 index 00000000..b161f4a2 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-id.po @@ -0,0 +1,1528 @@ +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-15 18:39+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Indonesian (http://www.transifex.com/piwik/wp-piwik/language/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "" + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "" + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "atau" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "Nama-Id" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "tidak direkomendasikan" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "Judul" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "" + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "" + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "" + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "" + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "Negara" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "Negara" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "Konversi" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "Pendapatan" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "Label" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "Kuantitas" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Katakunci" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "Halaman" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "" diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-it_IT.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..d693c790d416aa1133a59572e0c95b09cb855d06 GIT binary patch literal 26692 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, 2011 +# André Bräkling, 2015 +# Enzo Ferrara, 2015-2016 +# Stef Binde , 2013 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:41+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Italian (Italy) (http://www.transifex.com/piwik/wp-piwik/language/it_IT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it_IT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "%s %s installato." + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "Adesso crea una connessione a Piwik" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "%s aggiornato a %s." + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "Per favore controlla la tua configurazione" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Impostazioni" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "Wichtig" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Statistiche Piwik" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "Configura WP-Piwik" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "E' successo un errore" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "Assistenza" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "Stai ’barando’, vero?" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "Ricarica" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "Cambiamenti salvati." + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "Grazie per usare WP-Piwik!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s si è collegato con successo a Piwik %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "Stai eseguendo WordPress %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "Stai eseguendo una rete di blog (WPMU) WordPress %s. WP-Piwik gestirà i tuoi siti come differenti." + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "WP-Piwik %s non ha potuto collegarsi a Piwik utilizzando la tua configurazione. Controlla la sezione qui sotto »Collegati a Piwik«." + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "WP-Piwik non ha potuto collegarsi a Piwik utilizzando la tua conigurazione. Durante la connessione si è verificato il seguente errore:
%s" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "WP-Piwik %s deve prima essere collegato a Piwik. Controlla la sezione qui sotto »Collegati a Piwik«." + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Collegati a Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "Mostra Statistiche" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "Abilita il Tracking" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "Impostazioni per esperti" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "Ringraziamenti" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "WP-Piwik è un plugin di WordPress per mostrare una selezione di statistiche nella tua dashboard amministrativa di WordPress e per aggiungere e configurare il tuo codice di tracking di Piwik. Per utilizzarlo hai bisogno di una tua istanza di Piwik. Se ancora non hai un'installazione di Piwik, hai due semplici opzioni: utilizzane una" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "o" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "Maggiori informazioni" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "Puoi scegliere tra tre metodi di connessione:" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "Installazione autonoma (HTTP API, predefinito)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "Questa è l'opzione predefinita per un'installazione autonoma di Piwik e dovrebbe funzionare per la maggior parte delle configurazioni. WP-Piwik si connette a Piwik utilizzando il protocollo http(s)." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "Intallazione autonoma (PHP API)" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "Scegli questo se le tue installazioni autonome di Piwik e WordPress girano sullo stesso server e conosci il percorso completo alla tua istanza di Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Modalità Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "Disabilitato (WP-Piwik non è collegato a Piwik)" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "URL di Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "Inserisci l'URL del tuo Piwik. È lo stesso URL che utilizzi per accedere alla tua istanza di Piwik, es. http://www.example.com/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "Percorso di Piwik " + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "Inserisci il percorso alla tua istanza di Piwik, es. /var/www/piwik/." + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "Auth Token" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "Inserisci qui il tuo token auth di Piwik. Esso è un codice alfanumerico come 0a1b2c34d56e78901fa2bc3d45678efa." + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "Vedi le %sFAQ di WP-Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "Configurazione automatica" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "Spunta questo per selezionare automaticamente il tuo blog tra i siti Piwik tramite l'URL. Se il tuo blog non è inserito in Piwik Wp-Piwik lo aggiungerà." + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "Sito rilevato" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "Seleziona sito" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "Data predefinita di Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "Oggi" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "Ieri" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "Mese corrente" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "Mese scorso" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "Settimana corrente" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "Settimana scorsa" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "Il giorno che verrà mostrato sulla pagina delle statistiche." + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "Mostra dati SEO" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "Mostra i dati del ranking SEO nella pagina delle statistiche." + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "Lento!" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "Panoramica Dashboard" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "Disabilitato" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "Ultimi 30 giorni" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "Abilita un widget della dashboard di WP-Piwik "Panoramica"." + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "Grafico dashboard" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "Abilita un widget della dashboard di WP-Piwik "Grafico"." + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "Dashboard SEO" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "Abilita un widget della dashboard di WP-Piwik "SEO"." + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "Visualizza un grafico nella barra degli strumenti di Wordpress" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "Mostra un grafico dei visitatori degli ultimi 30 giorni nella barra degli strumenti di WordPress." + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "Mostra statistiche per" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "Seleziona il ruolo per poter accedere alla pagina di statistiche." + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "Mostra statistiche per post" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "Mostra statistiche sui singoli post nella pagina amministrativa di modifica post." + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "Scorciatoia di Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "Visualizzare una scorciatoia per il Piwik principale." + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "Nome visualizzato in WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "Nome del plugin mostrato in WordPress." + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "Abilita gli shortcode" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "Attiva scorciatoie nel contenuto di articoli e pagine. " + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "Puoi scegliere tra quattro modalità per il codice di tracking:" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "WP-Piwik non aggiunge il codice di tracciamento. Usa questo se vuoi aggiungere il codice alla tua template o usa un altro plugin per aggiungerlo." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "Tracking predefinito" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "WP-Piwik utilizzerà il tracking standard di Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "Usa js/index.php" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "Puoi scegliere questo codice di traking per fornire un codice proxy leggero e per evitare l'utilizzo dei files piwik.js e piwik.php." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "Vedi %sil file readme%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "Utilizza script proxy" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "Usa questo codice di tracking per non rivelare l'URL del server di Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "Vedi %sPiwik FAQ%s." + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "Inserisci manualmente" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "Inserisci manualmente un tuo codice tracking. Puoi scegliere una delle opzioni precedenti, preconfigurare il tuo codice e alla fine passare alla modifica manuale." + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "Usa il segnaposto {ID} per aggiungere l'ID sito di Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "Inserisci codice tracciamento" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "Codice tracking" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "Posizione codice JavaScript" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "Footer" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "Header" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "Scegli se il codice JavaScript è nel footer o nell'header." + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "Codice noscript" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Add <noscript>" +msgstr "Aggiungi <noscript>" + +#: classes/WP_Piwik/Admin/Settings.php:226 +msgid "Adds the <noscript> code to your footer." +msgstr "Aggiunge il codice <noscript> al footer." + +#: classes/WP_Piwik/Admin/Settings.php:226 +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Disabled in proxy mode." +msgstr "Disabilitato in modalità proxy." + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Add rec parameter to noscript code" +msgstr "Aggiungi il parametro rec al codice noscript" + +#: classes/WP_Piwik/Admin/Settings.php:228 +msgid "Enable tracking for visitors without JavaScript (not recommended)." +msgstr "Abilita il tracciamento dei visitatori senza JavaScript (non raccomandato)." + +#: classes/WP_Piwik/Admin/Settings.php:230 +msgid "Enable content tracking" +msgstr "Abilita il content tracking" + +#: classes/WP_Piwik/Admin/Settings.php:232 +msgid "Track all content blocks" +msgstr "Traccia tutti i blocchi di contenuto" + +#: classes/WP_Piwik/Admin/Settings.php:233 +msgid "Track only visible content blocks" +msgstr "Traccia solo i blocchi di contenuto visibili" + +#: classes/WP_Piwik/Admin/Settings.php:234 +msgid "" +"Content tracking allows you to track interaction with the content of a web " +"page or application." +msgstr "Il content tracking ti permette di tracciare le interazioni con il contenuto di una pagina web o di un'applicazione." + +#: classes/WP_Piwik/Admin/Settings.php:234 +#: classes/WP_Piwik/Admin/Settings.php:236 +#: classes/WP_Piwik/Admin/Settings.php:245 +#: classes/WP_Piwik/Admin/Settings.php:247 +#: classes/WP_Piwik/Admin/Settings.php:249 +#: classes/WP_Piwik/Admin/Settings.php:270 +#: classes/WP_Piwik/Admin/Settings.php:272 +#: classes/WP_Piwik/Admin/Settings.php:278 +#: classes/WP_Piwik/Admin/Settings.php:343 +#, php-format +msgid "See %sPiwik documentation%s." +msgstr "Leggi la %sDocumentazione di Piwik%s." + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Track search" +msgstr "Traccia le ricerche" + +#: classes/WP_Piwik/Admin/Settings.php:236 +msgid "Use Piwik's advanced Site Search Analytics feature." +msgstr "Utilizza la funzionalità avanzata di Piwik Statistiche Ricerche nel Sito." + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "Track 404" +msgstr "Tracciamento 404" + +#: classes/WP_Piwik/Admin/Settings.php:238 +msgid "" +"WP-Piwik can automatically add a 404-category to track 404-page-visits." +msgstr "WP-Piwik può aggiungere in automatico una categoria per tracciare visite 404." + +#: classes/WP_Piwik/Admin/Settings.php:241 +msgid "Add annotation on new post of type" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid "Show custom variables box" +msgstr "Mostra la casella variabili personalizzate" + +#: classes/WP_Piwik/Admin/Settings.php:247 +msgid " Show a "custom variables" edit box on post edit page." +msgstr "Mostra il box di modifica "variabili personalizzate" nella pagina di modifica post." + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "Add new file types for download tracking" +msgstr "Aggiungi nuovi tipi di file per il tracciamento dei download" + +#: classes/WP_Piwik/Admin/Settings.php:249 +msgid "" +"Add file extensions for download tracking, divided by a vertical bar " +"(|)." +msgstr "Aggiungi delle estensioni di file per il tracciamento dei download divisi da una barra verticale (|)." + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable cookies" +msgstr "Disattivare cookies" + +#: classes/WP_Piwik/Admin/Settings.php:251 +msgid "Disable all tracking cookies for a visitor." +msgstr "Disattiva tutti cookie per i visitatori." + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "Limit cookie lifetime" +msgstr "Limita la durata del cookie" + +#: classes/WP_Piwik/Admin/Settings.php:253 +msgid "" +"You can limit the cookie lifetime to avoid tracking your users over a longer" +" period as necessary." +msgstr "È possibile limitare la durata del cookie per evitare di monitorare i tuoi utenti per un periodo più lungo, se necessario." + +#: classes/WP_Piwik/Admin/Settings.php:255 +msgid "Visitor timeout (seconds)" +msgstr "Timeout visitatori (secondi)" + +#: classes/WP_Piwik/Admin/Settings.php:257 +msgid "Session timeout (seconds)" +msgstr "Timeout sessione (secondi)" + +#: classes/WP_Piwik/Admin/Settings.php:259 +msgid "Referral timeout (seconds)" +msgstr "Timeout referral (secondi)" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "Track admin pages" +msgstr "Traccia le pagine di amministrazione" + +#: classes/WP_Piwik/Admin/Settings.php:261 +msgid "" +"Enable to track users on admin pages (remember to configure the tracking " +"filter appropriately)." +msgstr "Abilita il tracciamento degli utenti sulle pagine di amministrazione (ricorda di configurare in modo opportuno il filtro di tracciamento)." + +#: classes/WP_Piwik/Admin/Settings.php:264 +msgid "Tracking filter" +msgstr "Filtro tracciamento" + +#: classes/WP_Piwik/Admin/Settings.php:268 +msgid "Choose users by user role you do not want to track." +msgstr "Seleziona utenti per ruolo che non vuoi tracciare." + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Track subdomains in the same website" +msgstr "Traccia i sotto-domini nello stesso sito web" + +#: classes/WP_Piwik/Admin/Settings.php:270 +msgid "Adds *.-prefix to cookie domain." +msgstr "Aggiunge il prefisso *.- al cookie di dominio." + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Do not count subdomains as outlink" +msgstr "Non contare i sotto-domini come link di uscita" + +#: classes/WP_Piwik/Admin/Settings.php:272 +msgid "Adds *.-prefix to tracked domain." +msgstr "Aggiunge il prefisso *.- al dominio tracciato." + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "Enable cross domain linking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:274 +msgid "" +"When enabled, it will make sure to use the same visitor ID for the same " +"visitor across several domains. This works only when this feature is enabled" +" because the visitor ID is stored in a cookie and cannot be read on the " +"other domain by default. When this feature is enabled, it will append a URL " +"parameter \"pk_vid\" that contains the visitor ID when a user clicks on a " +"URL that belongs to one of your domains. For this feature to work, you also " +"have to configure which domains should be treated as local in your Piwik " +"website settings. This feature requires Piwik 3.0.2." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Track RSS feeds" +msgstr "Traccia i feed RSS" + +#: classes/WP_Piwik/Admin/Settings.php:276 +msgid "Enable to track posts in feeds via tracking pixel." +msgstr "Abilita la possibilità di tracciare i post nei feed tramite un tracking pixel." + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "Track RSS feed links as campaign" +msgstr "Traccia i link dei feed RSS come campagna" + +#: classes/WP_Piwik/Admin/Settings.php:278 +msgid "This will add Piwik campaign parameters to the RSS feed links. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "RSS feed campaign" +msgstr "Campagna RSS feed" + +#: classes/WP_Piwik/Admin/Settings.php:280 +msgid "Keyword: post name." +msgstr "Keyword: nome post." + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "Enable heartbeat timer" +msgstr "Abilita un timer heartbeat" + +#: classes/WP_Piwik/Admin/Settings.php:282 +msgid "" +"Enable a heartbeat timer to get more accurate visit lengths by sending " +"periodical HTTP ping requests as long as the site is opened. Enter the time " +"between the pings in seconds (Piwik default: 15) to enable or 0 to disable " +"this feature. Note: This will cause a lot of additional " +"HTTP requests on your site." +msgstr "Abilita un timer heartbeat per ottenere durate delle visite più precise inviando un ping HTTP periodico per tutto il tempo in cui il sito resta aperto. Inserisci il tempo, in secondi, tra i ping (predefinito: 15) per abilitare, oppure 0 per disabilitare questa funzione. Nota: Questo provocherà molte richieste HTTP supplementari al tuo sito." + +#: classes/WP_Piwik/Admin/Settings.php:284 +msgid "User ID Tracking" +msgstr "Tracciamento ID Utente" + +#: classes/WP_Piwik/Admin/Settings.php:286 +msgid "WP User ID" +msgstr "ID Utente WP" + +#: classes/WP_Piwik/Admin/Settings.php:287 +msgid "Email Address" +msgstr "Indirizzo Email" + +#: classes/WP_Piwik/Admin/Settings.php:288 +msgid "Username" +msgstr "Nome utente" + +#: classes/WP_Piwik/Admin/Settings.php:289 +msgid "Display Name (Not Recommended!)" +msgstr "Mostra Nome (Non Raccomandato!)" + +#: classes/WP_Piwik/Admin/Settings.php:290 +msgid "" +"When a user is logged in to WordPress, track their "User ID". You " +"can select which field from the User's profile is tracked as the "User " +"ID". When enabled, Tracking based on Email Address is recommended." +msgstr "Quando un utente ha effettuato l'accesso a WordPress, traccia il suo "ID Utente". Puoi selezionare quale campo del profilo utente verrà tracciato come "ID Utente". Quando abilitato, si raccomanda il tracciamento basato sull'Indirizzo Email." + +#: classes/WP_Piwik/Admin/Settings.php:295 +msgid "" +"Usually, you do not need to change these settings. If you want to do so, you" +" should know what you do or you got an expert's advice." +msgstr "Di solito non hai la necessità di cambiare queste impostazioni. Se desideri farlo, devi sapere cosa fai o avere l'aiuto di un esperto." + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Enable cache" +msgstr "Abilita cache" + +#: classes/WP_Piwik/Admin/Settings.php:297 +msgid "Cache API calls, which not contain today's values, for a week." +msgstr "Cache settimanale delle chiamate API che non contiene i dati di oggi." + +#: classes/WP_Piwik/Admin/Settings.php:300 +msgid "HTTP connection via" +msgstr "Connessione HTTP tramite" + +#: classes/WP_Piwik/Admin/Settings.php:301 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "cURL" +msgstr "cURL" + +#: classes/WP_Piwik/Admin/Settings.php:302 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "fopen" +msgstr "fopen" + +#: classes/WP_Piwik/Admin/Settings.php:303 +msgid "" +"Choose whether WP-Piwik should use cURL or fopen to connect to Piwik in HTTP" +" or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:305 +msgid "HTTP method" +msgstr "Metodo HTTP" + +#: classes/WP_Piwik/Admin/Settings.php:306 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "POST" +msgstr "POST" + +#: classes/WP_Piwik/Admin/Settings.php:307 +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "GET" +msgstr "GET" + +#: classes/WP_Piwik/Admin/Settings.php:308 +msgid "Choose whether WP-Piwik should use POST or GET in HTTP or Cloud mode." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Disable time limit" +msgstr "Disattivare limite del tempo" + +#: classes/WP_Piwik/Admin/Settings.php:310 +msgid "Use set_time_limit(0) if stats page causes a time out." +msgstr "Usa set_time_limit(0) nel caso che la pagina delle statistiche genera un timeout." + +#: classes/WP_Piwik/Admin/Settings.php:312 +msgid "Connection timeout" +msgstr "Timeout connessione" + +#: classes/WP_Piwik/Admin/Settings.php:314 +msgid "Disable SSL peer verification" +msgstr "Disattivare verificazione Peer SSL" + +#: classes/WP_Piwik/Admin/Settings.php:314 +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "not recommended" +msgstr "sconsigliato" + +#: classes/WP_Piwik/Admin/Settings.php:315 +msgid "Disable SSL host verification" +msgstr "Disabilita la verifica host SSl" + +#: classes/WP_Piwik/Admin/Settings.php:317 +msgid "User agent" +msgstr "User agent" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "Use the PHP default user agent" +msgstr "Utilizza user agent PHP predefinito" + +#: classes/WP_Piwik/Admin/Settings.php:318 +msgid "empty" +msgstr "vuoto" + +#: classes/WP_Piwik/Admin/Settings.php:319 +msgid "Define a specific user agent" +msgstr "Definisci uno specifico user agent" + +#: classes/WP_Piwik/Admin/Settings.php:321 +msgid "Specific user agent" +msgstr "User agent specifico" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Enable DNS prefetch" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +#, php-format +msgid "See %sPiwik Blog%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:323 +msgid "Add a DNS prefetch tag. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "Add data-cfasync=false" +msgstr "Aggiungi attributo data-cfasync=false" + +#: classes/WP_Piwik/Admin/Settings.php:325 +#, php-format +msgid "See %sCloudFlare Knowledge Base%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:325 +msgid "" +"Adds data-cfasync=false to the script tag, e.g., to ask Rocket Loader to " +"ignore the script. " +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:327 +msgid "CDN URL" +msgstr "URL CDN" + +#: classes/WP_Piwik/Admin/Settings.php:329 +msgid "CDN URL (SSL)" +msgstr "URL CDN (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:331 +msgid "Force Piwik to use a specific protocol" +msgstr "Forza Piwik a utilizzare un protocollo specifico" + +#: classes/WP_Piwik/Admin/Settings.php:332 +msgid "Disabled (default)" +msgstr "Disabilitato (default)" + +#: classes/WP_Piwik/Admin/Settings.php:333 +msgid "http" +msgstr "http" + +#: classes/WP_Piwik/Admin/Settings.php:334 +msgid "https (SSL)" +msgstr "https (SSL)" + +#: classes/WP_Piwik/Admin/Settings.php:335 +msgid "" +"Choose if you want to explicitly force Piwik to use HTTP or HTTPS. Does not " +"work with a CDN URL." +msgstr "Scegli se vuoi esplicitamente forzare Piwik a utilizzare HTTP o HTTPS. Non funziona con URL CDN." + +#: classes/WP_Piwik/Admin/Settings.php:337 +msgid "Update notice" +msgstr "Notifica aggiornamento" + +#: classes/WP_Piwik/Admin/Settings.php:338 +msgid "Show always if WP-Piwik is updated" +msgstr "Mostra sempre se WP-Piwik è aggiornato" + +#: classes/WP_Piwik/Admin/Settings.php:339 +msgid "Show only if WP-Piwik is updated and settings were changed" +msgstr "Mostra solo se WP-Piwik è aggiornato e le impostazioni sono state cambiate" + +#: classes/WP_Piwik/Admin/Settings.php:341 +msgid "Choose if you want to get an update notice if WP-Piwik is updated." +msgstr "Scegli se vuoi ricevere una notifica di aggiornamento se WP-Piwik è aggiornato." + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "Define all file types for download tracking" +msgstr "Definisci tutti i tipi di file per il tracciamento dei download" + +#: classes/WP_Piwik/Admin/Settings.php:343 +msgid "" +"Replace Piwik's default file extensions for download tracking, divided by a " +"vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "Sostituisci le estensione predefinite dei file per il tracciamento dei download, divise da una barra verticale (|). Lascia vuoto per mantenere le impostazioni predefinite di Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "Set classes to be treated as downloads" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +msgid "" +"Set classes to be treated as downloads (in addition to piwik_download), " +"divided by a vertical bar (|). Leave blank to keep Piwik's default " +"settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:345 +#: classes/WP_Piwik/Admin/Settings.php:347 +#, php-format +msgid "See %sPiwik JavaScript Tracking Client reference%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "Set classes to be treated as outlinks" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:347 +msgid "" +"Set classes to be treated as outlinks (in addition to piwik_link), divided " +"by a vertical bar (|). Leave blank to keep Piwik's default settings." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:508 +msgid "Donate" +msgstr "Donazioni" + +#: classes/WP_Piwik/Admin/Settings.php:511 +msgid "If you like WP-Piwik, you can support its development by a donation:" +msgstr "Se ti piace WP-Piwik e vuoi contribuire al suo sviluppo, considera una donazione." + +#: classes/WP_Piwik/Admin/Settings.php:530 +msgid "My Amazon.de wishlist" +msgstr "Mia lista di desideri pressom Amazon.de" + +#: classes/WP_Piwik/Admin/Settings.php:533 +#: classes/WP_Piwik/Admin/Settings.php:575 +msgid "Please don't forget to vote the compatibility at the" +msgstr "Non scordarti di dare una valutazione di compatibilità nella " + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "Thank you very much for your donation" +msgstr "Grazie per le vostre donazioni" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid "the Piwik team itself" +msgstr "il team di Piwik stesso" + +#: classes/WP_Piwik/Admin/Settings.php:561 +msgid ", and all people flattering this" +msgstr ", è tutti che usano Flattr per donazioni a WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:562 +msgid "" +"Graphs powered by jqPlot (License: GPL 2.0 and MIT) and jQuery " +"Sparklines (License: New BSD License)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "Thank you very much" +msgstr "Mille grazie" + +#: classes/WP_Piwik/Admin/Settings.php:563 +msgid "for your translation work" +msgstr "per il vostro lavoro di traduzione" + +#: classes/WP_Piwik/Admin/Settings.php:564 +msgid "" +"Thank you very much, all users who send me mails containing criticism, " +"commendation, feature requests and bug reports! You help me to make WP-Piwik" +" much better." +msgstr "Un ringraziamento sentito per tutti gli utenti che mi inviano critiche, proposte e bug reports! Mi aiutate di migliorare WP-Piwik." + +#: classes/WP_Piwik/Admin/Settings.php:565 +msgid "" +"Thank you for using my plugin. It is the best commendation " +"if my piece of code is really used!" +msgstr "Grazie a te per usare il mio plugin. E' la più grande soddisfazione se il mio codice viene usato realmente!" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "The best place to get help:" +msgstr "Il posto migliore dove trovare aiuto:" + +#: classes/WP_Piwik/Admin/Settings.php:574 +msgid "WP-Piwik support forum" +msgstr "Forum di assistenza WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:577 +msgid "Debugging" +msgstr "Debugging" + +#: classes/WP_Piwik/Admin/Settings.php:578 +msgid "" +"Either allow_url_fopen has to be enabled or cURL has to be " +"available:" +msgstr "O allow_url_fopen deve essere attivato o cURL deve essere disponibile:" + +#: classes/WP_Piwik/Admin/Settings.php:581 +msgid "cURL is" +msgstr "cURL è" + +#: classes/WP_Piwik/Admin/Settings.php:582 +#: classes/WP_Piwik/Admin/Settings.php:587 +msgid "not" +msgstr "non" + +#: classes/WP_Piwik/Admin/Settings.php:583 +msgid "available" +msgstr "disponibile" + +#: classes/WP_Piwik/Admin/Settings.php:586 +msgid "allow_url_fopen is" +msgstr "allow_url_fopen è" + +#: classes/WP_Piwik/Admin/Settings.php:588 +msgid "enabled" +msgstr "attivato" + +#: classes/WP_Piwik/Admin/Settings.php:590 +msgid "is used." +msgstr "è utilizzato." + +#: classes/WP_Piwik/Admin/Settings.php:592 +msgid "Determined Piwik base URL is" +msgstr "L'URL base di Piwik è stata individuata in" + +#: classes/WP_Piwik/Admin/Settings.php:596 +msgid "Tools" +msgstr "Strumenti" + +#: classes/WP_Piwik/Admin/Settings.php:598 +msgid "Run testscript" +msgstr "Esegui script di prova" + +#: classes/WP_Piwik/Admin/Settings.php:599 +msgid "Sitebrowser" +msgstr "Sitebrowser" + +#: classes/WP_Piwik/Admin/Settings.php:600 +msgid "Clear cache" +msgstr "Svuota cache" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Are you sure you want to clear all settings?" +msgstr "Sei sicuro di voler azzerare tutte le impostazioni?" + +#: classes/WP_Piwik/Admin/Settings.php:601 +msgid "Reset WP-Piwik" +msgstr "Reimposta WP-Piwik" + +#: classes/WP_Piwik/Admin/Settings.php:603 +msgid "Latest support threads on WordPress.org" +msgstr "Gli ultimi thread di supporto su WordPress.org" + +#: classes/WP_Piwik/Admin/Settings.php:654 +msgid "Settings cleared (except connection settings)." +msgstr "Impostazioni azzerate (eccetto le impostazioni di connessione)" + +#: classes/WP_Piwik/Admin/Settings.php:670 +msgid "Cache cleared." +msgstr "Cache svuotata." + +#: classes/WP_Piwik/Admin/Sitebrowser.php:22 +msgid "site" +msgstr "sito" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:23 +msgid "sites" +msgstr "siti" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:29 +msgid "No site configured yet." +msgstr "Non è ancora stato configurato alcun sito" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:34 +msgid "Blog ID" +msgstr "ID blog" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:35 +msgid "Title" +msgstr "Titolo" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:36 +msgid "URL" +msgstr "URL" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:37 +msgid "Site ID (Piwik)" +msgstr "ID Pagina (Piwik)" + +#: classes/WP_Piwik/Admin/Sitebrowser.php:84 +msgid "Site not created yet." +msgstr "Non è ancora stato creato alcun sito" + +#: classes/WP_Piwik/Admin/Statistics.php:12 +msgid "Statistics" +msgstr "Statistiche" + +#: classes/WP_Piwik/Admin/Statistics.php:21 +msgid "Currently shown stats:" +msgstr "Statistiche mostrate attualmente:" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "Could not resolve" +msgstr "Impossibile risolvere" + +#: classes/WP_Piwik/Request/Php.php:27 +msgid "realpath() returns false" +msgstr "realpath() restituisce false" + +#: classes/WP_Piwik/Request/Php.php:39 +msgid "Class Piwik\\FrontController does not exists." +msgstr "La classe Piwik\\FrontController non esiste." + +#: classes/WP_Piwik/Request/Php.php:42 +msgid "Class Piwik\\API\\Request does not exists." +msgstr "La classe Piwik\\API\\Request non esiste." + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:10 +msgid "Piwik Custom Variables" +msgstr "Variabili Personalizzate di Piwik" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Name" +msgstr "Nome" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:21 +msgid "Value" +msgstr "Valore" + +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "Set custom variables for a page view" +msgstr "Imposta le variabili personalizzate per una visualizzazione di pagina" + +#: classes/WP_Piwik/Widget.php:91 +#: classes/WP_Piwik/Widget/BrowserDetails.php:37 +#: classes/WP_Piwik/Widget/Browsers.php:37 +#: classes/WP_Piwik/Widget/Chart.php:43 classes/WP_Piwik/Widget/Country.php:37 +#: classes/WP_Piwik/Widget/Ecommerce.php:23 +#: classes/WP_Piwik/Widget/Items.php:23 +#: classes/WP_Piwik/Widget/ItemsCategory.php:23 +#: classes/WP_Piwik/Widget/Noresult.php:23 +#: classes/WP_Piwik/Widget/Overview.php:24 +#: classes/WP_Piwik/Widget/Plugins.php:23 classes/WP_Piwik/Widget/Post.php:25 +#: classes/WP_Piwik/Widget/Screens.php:35 +#: classes/WP_Piwik/Widget/Search.php:23 classes/WP_Piwik/Widget/Seo.php:20 +#: classes/WP_Piwik/Widget/SystemDetails.php:33 +#: classes/WP_Piwik/Widget/Systems.php:33 +#: classes/WP_Piwik/Widget/Visitors.php:35 +msgid "Piwik error" +msgstr "Errore di Piwik" + +#: classes/WP_Piwik/Widget.php:100 +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Unique" +msgstr "Unici" + +#: classes/WP_Piwik/Widget.php:102 classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Visits" +msgstr "Visite" + +#: classes/WP_Piwik/Widget.php:104 +msgid "Hits" +msgstr "Clicks" + +#: classes/WP_Piwik/Widget.php:106 +msgid "Actions" +msgstr "Azioni" + +#: classes/WP_Piwik/Widget.php:162 +msgid "No data available." +msgstr "Nessun dato disponibile." + +#: classes/WP_Piwik/Widget.php:243 +msgid "today" +msgstr "oggi" + +#: classes/WP_Piwik/Widget.php:248 +msgid "current month" +msgstr "mese corrente" + +#: classes/WP_Piwik/Widget.php:253 +msgid "last month" +msgstr "mese scorso" + +#: classes/WP_Piwik/Widget.php:258 +msgid "current week" +msgstr "settimana corrente" + +#: classes/WP_Piwik/Widget.php:263 +msgid "last week" +msgstr "settimana scorsa" + +#: classes/WP_Piwik/Widget.php:268 +msgid "yesterday" +msgstr "ieri" + +#: classes/WP_Piwik/Widget.php:293 +msgid "week" +msgstr "settimana" + +#: classes/WP_Piwik/Widget.php:328 +msgid "last 30 days" +msgstr "gli ultimi 30 giorni" + +#: classes/WP_Piwik/Widget.php:330 +msgid "last 12 " +msgstr "" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:18 +msgid "Browser Details" +msgstr "Dettagli browser" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +msgid "Browser" +msgstr "Browser" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:39 +#: classes/WP_Piwik/Widget/Browsers.php:39 +#: classes/WP_Piwik/Widget/Country.php:39 +#: classes/WP_Piwik/Widget/Plugins.php:25 +#: classes/WP_Piwik/Widget/Screens.php:37 +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Percent" +msgstr "Percentuale" + +#: classes/WP_Piwik/Widget/BrowserDetails.php:66 +#: classes/WP_Piwik/Widget/Browsers.php:66 +#: classes/WP_Piwik/Widget/Country.php:66 +#: classes/WP_Piwik/Widget/Screens.php:64 +#: classes/WP_Piwik/Widget/SystemDetails.php:62 +#: classes/WP_Piwik/Widget/Systems.php:62 +msgid "Others" +msgstr "Altri " + +#: classes/WP_Piwik/Widget/Browsers.php:18 +msgid "Browsers" +msgstr "Browser" + +#: classes/WP_Piwik/Widget/Chart.php:19 +#: classes/WP_Piwik/Widget/Overview.php:48 classes/WP_Piwik/Widget/Post.php:37 +#: classes/WP_Piwik/Widget/Visitors.php:17 +msgid "Visitors" +msgstr "Visitatori" + +#: classes/WP_Piwik/Widget/Chart.php:71 +msgid "" +"The graph contains the values shown in the table below (visitors / unique / " +"bounces). The red line shows a linear trendline (unique)." +msgstr "Il grafico contiene i valori mostrati nella tabella qui sotto (visitatori / unici / rimbalzi). La riga rossa mostra una linea di tendenza lineare (visitatori unici)." + +#: classes/WP_Piwik/Widget/Country.php:18 +msgid "Countries" +msgstr "Nazioni" + +#: classes/WP_Piwik/Widget/Country.php:39 +msgid "Country" +msgstr "Nazione" + +#: classes/WP_Piwik/Widget/Ecommerce.php:11 +msgid "E-Commerce" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:27 +msgid "Conversions" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:28 +msgid "Visits converted" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:29 +#: classes/WP_Piwik/Widget/Items.php:27 +#: classes/WP_Piwik/Widget/ItemsCategory.php:27 +msgid "Revenue" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:30 +#: classes/WP_Piwik/Widget/Items.php:32 +#: classes/WP_Piwik/Widget/ItemsCategory.php:32 +msgid "Conversion rate" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:31 +msgid "Conversions (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:32 +msgid "Visits converted (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:33 +msgid "Revenue (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:34 +msgid "Conversion rate (new visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:35 +msgid "Conversions (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:36 +msgid "Visits converted (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:37 +msgid "Revenue (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:38 +msgid "Conversion rate (returning visitor)" +msgstr "" + +#: classes/WP_Piwik/Widget/Ecommerce.php:40 +#: classes/WP_Piwik/Widget/Overview.php:58 classes/WP_Piwik/Widget/Post.php:46 +msgid "Shortcut" +msgstr "Scorciatoia" + +#: classes/WP_Piwik/Widget/Items.php:11 +msgid "E-Commerce Items" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:26 +#: classes/WP_Piwik/Widget/ItemsCategory.php:26 +msgid "Label" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:28 +#: classes/WP_Piwik/Widget/ItemsCategory.php:28 +msgid "Quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:29 +#: classes/WP_Piwik/Widget/ItemsCategory.php:29 +msgid "Orders" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:30 +#: classes/WP_Piwik/Widget/ItemsCategory.php:30 +msgid "Avg. price" +msgstr "" + +#: classes/WP_Piwik/Widget/Items.php:31 +#: classes/WP_Piwik/Widget/ItemsCategory.php:31 +msgid "Avg. quantity" +msgstr "" + +#: classes/WP_Piwik/Widget/ItemsCategory.php:11 +msgid "E-Commerce Item Categories" +msgstr "" + +#: classes/WP_Piwik/Widget/Keywords.php:16 +msgid "Keywords" +msgstr "Parole chiave" + +#: classes/WP_Piwik/Widget/Noresult.php:16 +#: classes/WP_Piwik/Widget/Search.php:16 +msgid "Site Search" +msgstr "Ricerca Sito" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Keyword" +msgstr "Parole chiavi" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +msgid "Requests" +msgstr "Richieste" + +#: classes/WP_Piwik/Widget/Noresult.php:25 +#: classes/WP_Piwik/Widget/Search.php:25 +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Bounced" +msgstr "Uscite" + +#: classes/WP_Piwik/Widget/Overview.php:17 classes/WP_Piwik/Widget/Post.php:18 +msgid "Overview" +msgstr "Resoconto" + +#: classes/WP_Piwik/Widget/Overview.php:17 +msgid "dashboard" +msgstr "" + +#: classes/WP_Piwik/Widget/Overview.php:50 classes/WP_Piwik/Widget/Post.php:38 +msgid "Unique visitors" +msgstr "Visitatori unici" + +#: classes/WP_Piwik/Widget/Overview.php:52 classes/WP_Piwik/Widget/Post.php:39 +msgid "Page views" +msgstr "Pagine viste" + +#: classes/WP_Piwik/Widget/Overview.php:53 classes/WP_Piwik/Widget/Post.php:40 +msgid "Total time spent" +msgstr "Tempo di rimanenza" + +#: classes/WP_Piwik/Widget/Overview.php:54 classes/WP_Piwik/Widget/Post.php:42 +msgid "Bounce count" +msgstr "Rimbalzi " + +#: classes/WP_Piwik/Widget/Overview.php:57 classes/WP_Piwik/Widget/Post.php:41 +msgid "Time/visit" +msgstr "Media durata per visita" + +#: classes/WP_Piwik/Widget/Overview.php:57 +msgid "Max. page views in one visit" +msgstr "Massimo di pagine viste in una visita" + +#: classes/WP_Piwik/Widget/Pages.php:16 +msgid "Pages" +msgstr "Pagine" + +#: classes/WP_Piwik/Widget/Pages.php:18 +msgid "Page" +msgstr "Pagina" + +#: classes/WP_Piwik/Widget/Plugins.php:16 +msgid "Plugins" +msgstr "Plugins" + +#: classes/WP_Piwik/Widget/Plugins.php:25 +msgid "Plugin" +msgstr "Plugin" + +#: classes/WP_Piwik/Widget/Post.php:43 +msgid "Min. generation time" +msgstr "Minimo tempo di generazione" + +#: classes/WP_Piwik/Widget/Post.php:44 +msgid "Max. generation time" +msgstr "Massimo tempo di generazione" + +#: classes/WP_Piwik/Widget/Referrers.php:16 +msgid "Referrers" +msgstr "Referrers" + +#: classes/WP_Piwik/Widget/Screens.php:16 +msgid "Resolutions" +msgstr "Risoluzioni" + +#: classes/WP_Piwik/Widget/Screens.php:37 +msgid "Resolution" +msgstr "Risoluzione" + +#: classes/WP_Piwik/Widget/Seo.php:13 +msgid "SEO" +msgstr "SEO" + +#: classes/WP_Piwik/Widget/SystemDetails.php:14 +msgid "Operation System Details" +msgstr "Dettagli Sistema Operativo" + +#: classes/WP_Piwik/Widget/SystemDetails.php:35 +#: classes/WP_Piwik/Widget/Systems.php:35 +msgid "Operation System" +msgstr "Sistema Operativo" + +#: classes/WP_Piwik/Widget/Systems.php:14 +msgid "Operation Systems" +msgstr "Sistemi Operativi" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Date" +msgstr "Data" + +#: classes/WP_Piwik/Widget/Visitors.php:57 +msgid "Page Views" +msgstr "Pagine Viste" + +#: wp-piwik.php:60 +#, php-format +msgid "" +"WP-Piwik requires at least PHP 5.3. You are using the deprecated version %s." +" Please update PHP to use WP-Piwik." +msgstr "WP-Piwik richiede almeno PHP 5.3. Tu stai utilizzando la versione deprecata %s. Aggiorna PHP per utilizzare WP-Piwik." diff --git a/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-lb.mo b/wp-content/upgrade-temp-backup/plugins/wp-piwik/languages/wp-piwik-lb.mo new file mode 100644 index 0000000000000000000000000000000000000000..332acad3fc1ceb8099997af2540fe9519b812c2c GIT binary patch literal 5705 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, 2015 +msgid "" +msgstr "" +"Project-Id-Version: WP-Piwik\n" +"POT-Creation-Date: 2017-10-09 20:37+0200\n" +"PO-Revision-Date: 2017-10-09 20:41+0000\n" +"Last-Translator: André Bräkling\n" +"Language-Team: Luxembourgish (http://www.transifex.com/piwik/wp-piwik/language/lb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: classes/WP_Piwik.php:203 +#, php-format +msgid "%s %s installed." +msgstr "%s %s installéiert." + +#: classes/WP_Piwik.php:203 +msgid "Next you should connect to Piwik" +msgstr "" + +#: classes/WP_Piwik.php:237 +#, php-format +msgid "%s updated to %s." +msgstr "" + +#: classes/WP_Piwik.php:237 +msgid "Please validate your configuration" +msgstr "" + +#: classes/WP_Piwik.php:269 classes/WP_Piwik.php:527 +msgid "Settings" +msgstr "Astellungen" + +#: classes/WP_Piwik.php:272 +msgid "Important" +msgstr "Wichteg" + +#: classes/WP_Piwik.php:387 classes/WP_Piwik.php:409 +msgid "Piwik Statistics" +msgstr "Piwik-Statistiken" + +#: classes/WP_Piwik.php:499 +msgid "Configure WP-Piwik" +msgstr "WP-Piwik konfiguréieren" + +#: classes/WP_Piwik.php:992 +msgid "An error occured" +msgstr "E Feeler ass opgetrueden" + +#: classes/WP_Piwik.php:992 classes/WP_Piwik/Admin/Settings.php:89 +msgid "Support" +msgstr "Ënnerstëtzung" + +#: classes/WP_Piwik.php:1275 +msgid "Cheatin’ uh?" +msgstr "Du fuddels, hë?" + +#: classes/WP_Piwik/Admin/Settings.php:24 +msgid "Reload" +msgstr "Nei lueden" + +#: classes/WP_Piwik/Admin/Settings.php:27 +msgid "Changes saved." +msgstr "Ännerunge gespäichert." + +#: classes/WP_Piwik/Admin/Settings.php:55 +msgid "Thanks for using WP-Piwik!" +msgstr "Merci dass du WP-Piwik benotz!" + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "WP-Piwik %s is successfully connected to Piwik %s." +msgstr "WP-Piwik %s ass erfollegräich mat Piwik %s verbonnen." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "You are running WordPress %s." +msgstr "Du benotz WordPress %s." + +#: classes/WP_Piwik/Admin/Settings.php:58 +#, php-format +msgid "" +"You are running a WordPress %s blog network (WPMU). WP-Piwik will handle " +"your sites as different websites." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:62 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. Check" +" the »Connect to Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:64 +#, php-format +msgid "" +"WP-Piwik %s was not able to connect to Piwik using your configuration. " +"During connection the following error occured:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:67 +#, php-format +msgid "" +"WP-Piwik %s has to be connected to Piwik first. Check the »Connect to " +"Piwik« section below." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:71 +msgid "Connect to Piwik" +msgstr "Mat Piwik verbannen" + +#: classes/WP_Piwik/Admin/Settings.php:76 +msgid "Show Statistics" +msgstr "Statistiken uweisen" + +#: classes/WP_Piwik/Admin/Settings.php:80 +msgid "Enable Tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:85 +msgid "Expert Settings" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:93 +msgid "Credits" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "" +"WP-Piwik is a WordPress plugin to show a selection of Piwik stats in your " +"WordPress admin dashboard and to add and configure your Piwik tracking code." +" To use this you will need your own Piwik instance. If you do not already " +"have a Piwik setup, you have two simple options: use either" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a self-hosted Piwik" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "or" +msgstr "oder" + +#: classes/WP_Piwik/Admin/Settings.php:106 +msgid "a cloud-hosted Piwik by InnoCraft" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +msgid "" +"Neither cURL nor fopen are available. So WP-Piwik can not use the HTTP API " +"and not connect to InnoCraft Cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:109 +#: classes/WP_Piwik/Template/MetaBoxCustomVars.php:30 +msgid "More information" +msgstr "Méi Informatiounen" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "You can choose between three connection methods:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:114 +msgid "Self-hosted (HTTP API, default)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"This is the default option for a self-hosted Piwik and should work for most " +"configurations. WP-Piwik will connect to Piwik using http(s)." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:115 +msgid "Self-hosted (PHP API)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"Choose this, if your self-hosted Piwik and WordPress are running on the same" +" machine and you know the full server path to your Piwik instance." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +#: classes/WP_Piwik/Admin/Settings.php:116 +msgid "Cloud-hosted (InnoCraft Cloud)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:111 +msgid "" +"If you are using a cloud-hosted Piwik by InnoCraft, you can simply use this " +"option." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:112 +msgid "Piwik Mode" +msgstr "Piwik-Modus" + +#: classes/WP_Piwik/Admin/Settings.php:113 +msgid "Disabled (WP-Piwik will not connect to Piwik)" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "Piwik URL" +msgstr "Piwik-Adress" + +#: classes/WP_Piwik/Admin/Settings.php:119 +msgid "" +"Enter your Piwik URL. This is the same URL you use to access your Piwik " +"instance, e.g. http://www.example.com/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Piwik path" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:120 +msgid "Enter the file path to your Piwik instance, e.g. /var/www/piwik/." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "Piwik subdomain" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:121 +msgid "" +"Enter your InnoCraft Cloud subdomain. It is also part of your URL: " +"https://SUBDOMAIN.innocraft.cloud." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "Auth token" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +msgid "" +"Enter your Piwik auth token here. It is an alphanumerical code like " +"0a1b2c34d56e78901fa2bc3d45678efa." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:122 +#, php-format +msgid "See %sWP-Piwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "Auto config" +msgstr "Automatesch konfiguréieren" + +#: classes/WP_Piwik/Admin/Settings.php:127 +msgid "" +"Check this to automatically choose your blog from your Piwik sites by URL. " +"If your blog is not added to Piwik yet, WP-Piwik will add a new site." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:131 +#, php-format +msgid "" +"WP-Piwik %s was not able to get sites with at least view access:
%s" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:141 +msgid "Determined site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:146 +msgid "Select site" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:155 +msgid "Piwik default date" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:156 +#: classes/WP_Piwik/Admin/Settings.php:170 +msgid "Today" +msgstr "Haut" + +#: classes/WP_Piwik/Admin/Settings.php:157 +#: classes/WP_Piwik/Admin/Settings.php:169 +msgid "Yesterday" +msgstr "Gëschter" + +#: classes/WP_Piwik/Admin/Settings.php:158 +msgid "Current month" +msgstr "Aktuelle Mount" + +#: classes/WP_Piwik/Admin/Settings.php:159 +msgid "Last month" +msgstr "Leschte Mount" + +#: classes/WP_Piwik/Admin/Settings.php:160 +msgid "Current week" +msgstr "Aktuell Woch" + +#: classes/WP_Piwik/Admin/Settings.php:161 +msgid "Last week" +msgstr "Lescht Woch" + +#: classes/WP_Piwik/Admin/Settings.php:162 +msgid "Default date shown on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Show SEO data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +msgid "Display SEO ranking data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:164 +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Slow!" +msgstr "Lues!" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Show e-commerce data" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:165 +msgid "Display e-commerce data on statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:167 +msgid "Dashboard overview" +msgstr "Iwwersiicht um Tableau de Bord" + +#: classes/WP_Piwik/Admin/Settings.php:168 +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:210 +#: classes/WP_Piwik/Admin/Settings.php:231 +#: classes/WP_Piwik/Admin/Settings.php:285 +#: classes/WP_Piwik/Admin/Settings.php:340 +msgid "Disabled" +msgstr "DeaktivéIert" + +#: classes/WP_Piwik/Admin/Settings.php:171 +msgid "Last 30 days" +msgstr "Lescht 30 Deeg" + +#: classes/WP_Piwik/Admin/Settings.php:172 +msgid "Enable WP-Piwik dashboard widget "Overview"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Dashboard graph" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:174 +msgid "Enable WP-Piwik dashboard widget "Graph"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Dashboard SEO" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:176 +msgid "Enable WP-Piwik dashboard widget "SEO"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Dashboard e-commerce" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:178 +msgid "Enable WP-Piwik dashboard widget "E-commerce"." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Show graph on WordPress Toolbar" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:180 +msgid "Display a last 30 days visitor graph on WordPress' toolbar." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:182 +msgid "Display stats to" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:189 +msgid "Choose user roles allowed to see the statistics page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show per post stats" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:191 +msgid "Show stats about single posts at the post edit admin page." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Piwik shortcut" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:193 +msgid "Display a shortcut to Piwik itself." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "WP-Piwik display name" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:195 +msgid "Plugin name shown in WordPress." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:197 +msgid "Enable shortcodes in post or page content." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "You can choose between four tracking code modes:" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"WP-Piwik will not add the tracking code. Use this, if you want to add the " +"tracking code to your template files or you use another plugin to add the " +"tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:211 +msgid "Default tracking" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "WP-Piwik will use Piwik's standard tracking code." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:212 +msgid "Use js/index.php" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"You can choose this tracking code, to deliver a minified proxy code and to " +"avoid using the files called piwik.js or piwik.php." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#, php-format +msgid "See %sreadme file%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:213 +msgid "Use proxy script" +msgstr "Proxy-Skript benotzen" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use this tracking code to not reveal the Piwik server URL." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:228 +#: classes/WP_Piwik/Admin/Settings.php:238 +#, php-format +msgid "See %sPiwik FAQ%s." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +#: classes/WP_Piwik/Admin/Settings.php:214 +msgid "Enter manually" +msgstr "Manuell aginn" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "" +"Enter your own tracking code manually. You can choose one of the prior " +"options, pre-configure your tracking code and switch to manually editing at " +"last." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:208 +msgid "Use the placeholder {ID} to add the Piwik site ID." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:209 +msgid "Add tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:217 +msgid "Tracking code" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:219 +msgid "JavaScript code position" +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:220 +msgid "Footer" +msgstr "Säitefouss" + +#: classes/WP_Piwik/Admin/Settings.php:221 +msgid "Header" +msgstr "Säitekapp" + +#: classes/WP_Piwik/Admin/Settings.php:222 +msgid "" +"Choose whether the JavaScript code is added to the footer or the header." +msgstr "" + +#: classes/WP_Piwik/Admin/Settings.php:224 +msgid "Noscript code" +msgstr "\"